【发布时间】:2016-09-23 04:27:18
【问题描述】:
在我正在进行的新项目中,我开始使用组件而不是指令。
但是,我遇到了一个问题,我找不到具体的标准方法。
将事件从孩子通知给父母很容易,您可以在下面的我的 plunkr 上找到它,但是将事件从父母通知给孩子的正确方法是什么?
Angular2 似乎通过使用以下方式解决了这个问题:https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-local-var 但我不认为有可能像#timer 示例那样定义指向子组件的“指针”
为了尽可能轻松地转换为 Angular2,我想避免:
- 事件发射(从作用域发射和广播)
- 使用来自子级的要求(然后向父级添加回调..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示例
【问题讨论】:
-
您到底想通知孩子什么?您通常不需要这样做。大多数情况下都覆盖了绑定,例如:plnkr.co/edit/NcbNOAnOqMhxqvvLR74O?p=info还不够吗?
-
例如,child 是一个网格,parent 有一个搜索按钮,当我按下这个按钮时我想刷新网格,所以我进行了 ajax 调用,这不能通过绑定来实现,对吧?
-
可以的。您可以对这些绑定中的更改做出反应(没有 $scope.$watch)。如果到那时您还没有得到答复,可以在我 2 小时后回来时发布示例。
-
太好了,无论如何都会等待您的答复!谢谢队友
标签: javascript angularjs angular-directive angular-components