当前位置: 首页 > 面试题库 >

在AngularJS组件中将事件从父级传递到子级

艾俊晖
2023-03-14
问题内容

在我正在从事的新项目中,我开始使用组件而不是指令。

但是,我遇到一个无法找到具体标准方法的问题。

从孩子向父母通知事件很容易,您可以在下面的我的plunkr上找到它,但是从父母向孩子通知事件的正确方法是什么?

Angular2似乎通过使用以下方法解决了此问题:https
://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-
to-child-local-var 但是我不知道可以像在#timer中所做的那样,为子组件定义一个“指针”

为了保持向Angular2的轻松转换,我想避免:

  • 发出事件(从示波器发射和广播)
  • 使用子项的require(然后向父项添加回调。.UGLY)
  • 使用单向绑定,将作用域注入子项中,然后“监视”该属性。

示例代码:

var app = angular.module('plunker', []);

app.controller('RootController', function() {
});

app.component('parentComponent', {
  template: `
    <h3>Parent component</h3>
    <a class="btn btn-default btn-sm" ng-click="$ctrl.click()">Notify Child</a>
    <span data-ng-bind="$ctrl.childMessage"></span>
    <child-component on-change="$ctrl.notifiedFromChild(count)"></child-component>
  `,
  controller: function() {
    var ctrl = this;
    ctrl.notifiedFromChild = function(count){
      ctrl.childMessage = "From child " + count;
    }
    ctrl.click = function(){
    }
  },
  bindings: {
  }
});

app.component('childComponent', {
  template: `
    <h4>Child component</h4>
    <a class="btn btn-default btn-sm" ng-click="$ctrl.click()">Notify Parent</a>
  `,
  controller: function() {
    var ctrl = this;
    ctrl.counter = 0;
    ctrl.click = function(){
        ctrl.onChange({ count: ++ctrl.counter });
    }
  },
  bindings: {
    onChange: '&'
  }
});

您可以在此处找到示例:

http://plnkr.co/edit/SCK8XlYoYCRceCP7q2Rn?p=preview

这是我创建的可能解决方案

http://plnkr.co/edit/OfANmt4zLyPG2SZyVNLr?p=preview

孩子需要父母的地方,然后孩子为孩子设置了父母的引用…现在父母可以使用孩子了…丑陋,但就像上面的angular2示例


问题答案:

在AngularJS组件中将事件从父级传递到子级

使用表达式绑定发布指令$ API

要允许父组件将事件传达给子组件,请让子组件发布API:

<grid-component grid-on-init="$ctrl.gridApi=$API; $ctrl.someFn($API)">
</grid-component>

JS

app.component('gridComponent', {
  //Create API binding
  bindings: {gridOnInit: "&"},
  template: `
    <h4>Grid component</h4>
    <p> Save count = {{$ctrl.count}}</p>
  `,
  controller: function() {
    var ctrl = this;
    this.$onInit = function() {
        ctrl.count = 0;
        ctrl.api = {};
        //Publish save function
        ctrl.api.save = save;
        //Invoke Expression with $API as local
        ctrl.gridOnInit({$API: ctrl.api});
    };
    function save(){
      console.log("saved!");
      ctrl.count++;
    }
  }
});

上面的示例调用grid-on-init属性定义的Angular Expression
,其API公开为$API。这种方法的优点是,父级可以通过将函数传递给带有Angular Expression的子级组件来对子级初始化做出反应。

从文档中:

“隔离”范围对象哈希定义了一组从指令元素上的属性派生的局部范围属性。这些本地属性对于为模板的别名设置别名很有用。对象哈希中的键映射到隔离范围内的属性的名称。这些值通过匹配指令元素上的属性来定义如何将属性绑定到父作用域:

  • &&attr-提供一种在父作用域的上下文中执行表达式的方法。如果未指定attr名称,则假定属性名称与本地名称相同。给定<my- component my-attr="count = count + value">和隔离范围定义scope:{ localFn:'&myAttr' },isolate scope属性localFn将指向的函数包装count = count + value expression。通常,需要将数据从隔离范围通过表达式传递到父范围。这可以通过将局部变量名称和值的映射传递到表达式包装器fn中来完成。例如,如果表达式为,increment($amount)则可以通过调用localFnas
    来指定金额值localFn({$amount: 22})

- AngularJS综合指令API
-范围

按照惯例,我建议给局部变量加上前缀,$以将其与父变量区分开。

交替使用双向绑定

注意: 为简化向Angular
2+的过渡,请避免使用双向=绑定。而是使用单向<绑定和表达式&绑定。有关更多信息,请参阅《AngularJS开发人员指南-
了解组件》。

要允许父组件将事件传达给子组件,请让子组件发布API:

<grid-component api="$ctrl.gridApi"></grid-component>

在上面的示例中,grid-component使用api属性使用绑定将其API发布到父级作用域上。

app.component('gridComponent', {
  //Create API binding
  bindings: {api: "="},
  template: `
    <h4>Grid component</h4>
    <p> Save count = {{$ctrl.count}}</p>
  `,
  controller: function() {
    var ctrl = this;
    this.$onInit = function() {
        ctrl.count = 0;
        ctrl.api = {};
        //Publish save function
        ctrl.api.save = save;
    };
    function save(){
      console.log("saved!");
      ctrl.count++;
    }
  }
});

然后,父组件可以save使用已发布的API 调用子函数

ctrl.click = function(){
  console.log("Search clicked");
  ctrl.gridApi.save();
}

在上PLNKR DEMO。



 类似资料:
  • 问题内容: 我有两个组成部分: 第一个是父组件,它是通常的React组件。 第二个是孩子,它是功能组件。 我想将 Titles 的值(处于子状态)传递给父Component。这是我的 子组件 代码: 这是我的 父组件 : 这看起来很容易,但这是我第一次使用功能组件。你能帮我吗 ? 问题答案: React就是关于在组件树中向下流动的数据。如果您希望能够显示和/或修改彼此之间的共享状态,则应提升状态并

  • 我正在使用样式组件库与TypeScript。当创建从react组件继承样式化组件时,我遇到了问题。是node_module(我无法更改的行为)。但是将所有道具传递给。 如果具有没有的任何属性,则控制台中会显示警告消息,因为没有属性: 警告:React无法识别DOM元素上的属性。如果您有意希望它作为自定义属性出现在DOM中,请将其拼成小写。如果您不小心从父组件传递了它,请将它从DOM元素中移除。 在

  • 子组件事件能否到传递父组件

  • 问题内容: 在React中,我有类似的文件 parent.js 包含文本框和按钮 child.js 包含P标签 App.js 包含父组件和子组件 问题 将“父级”上的“文本框”值传递给子级,并将其显示在子级标记中。 完整代码 堆叠 问题答案: 更新了示例以将数据传递给子组件。 https://stackblitz.com/edit/react- trmj9i?file=child.js 在下面添加

  • 问题内容: 我正在尝试将数据从子组件发送到其父组件,如下所示: 这是子组件: 我需要的是由用户在父组件中获取选定的值。我收到此错误: 谁能帮我发现问题? PS子组件正在从json文件创建一个下拉列表,并且我需要该下拉列表来显示json数组的两个元素彼此相邻(例如:“ aaa,english”是首选!) 问题答案: 这应该工作。在发送回道具时,您将其作为对象发送,而不是作为值发送,或者将其用作父组件

  • 我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在中不建议使用这种方法,我必须执行emit,这非常糟糕。所以我的代码是这个。 正如您所看到的,在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。 什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。