我正在使用双向数据绑定建立组件间通信。我有一个父控制器,该控制器从AJAX调用中获取数据并将该数据发送到2个组件。
我试图修改传递给组件的数据,但是如果child1组件更新了数据,尽管存在两种方式的数据绑定,子组件也无法获取更新数据。我读到$ onChanges钩子不会捕获双向数据绑定的change事件。
<div ng-controller="ParentController as ctrl">
<child1 data="ctrl.data"></child1>
<child2 data="ctrl.data"></child>
</div>
父控制器:
var app = angular.module('app',[]);
app.controller('ParentController', function($scope, $get){
//get data from AJAX call
this.data = getDataFromAjaxCall();
}
Child1组件:
app.component('child1',{
bindings : {
data : '='
},
controller: function($scope){
var self = this;
self.$onChanges = function(changes){
if(changes.data)
console.log('data changed');
}
self.addData = function(){
self.data.push({
id : 10,
name : 'abc'
});
}
}
});
Child2组件:
app.component('child2',{
bindings : {
data : '='
},
controller: function($scope){
var self = this;
self.$onChanges = function(changes){
if(changes.data)
console.log('data changed');
}
self.addData = function(){
self.data.push({
id : 20,
name : 'pqr'
});
}
}
});
如果child2组件修改了数据,我希望在child1组件中获取更新的数据,反之亦然。
答案 0 :(得分:1)
$onChanges
life-cycle hook仅在更改单向("<"
)和属性("@"
)绑定时触发。不会更改双向("="
)绑定。
对于组件,对输入使用单向("<"
)绑定,对输出使用表达式("&"
)绑定:
app.component('child1',{
bindings: {
̶d̶a̶t̶a̶ ̶:̶ ̶'̶=̶'̶
facts: "<",
factsChange: "&",
},
controller: function(){
this.$onChanges = function(changes){
if(changes.facts)
console.log('facts changed');
}
}
});
避免使用双向("="
)绑定。它们使向Angular 2+的迁移更加困难。
有关更多信息,请参见AngularJS Developer Guide - Component-Based Application Architecture。
还要注意以data
开头的绑定。指令规范化将删除以data-
开头的名称。参见AngularJS Developer Guide - Directive Normalization。
执行XHR的函数无法返回数据。他们只能返回需要从中提取数据的承诺。
var app = angular.module('app',[]);
app.controller('ParentController', function($scope, $get){
//get data from AJAX call
̶t̶h̶i̶s̶.̶d̶a̶t̶a̶ ̶=̶ ̶g̶e̶t̶D̶a̶t̶a̶F̶r̶o̶m̶A̶j̶a̶x̶C̶a̶l̶l̶(̶)̶;̶
var promise = getDataFromAjaxCall();
promise.then( response => {
this.data = response.data;
});
}
JavaScript浏览器将单线程非阻塞事件驱动的架构用于IO。熟悉命令式编程风格的程序员需要更改使用JavaScript浏览器对IO的思考方式。