【问题标题】:Two way data bindings does not trigger $onChanges in Components两种方式的数据绑定不会触发组件中的 $onChanges
【发布时间】:2019-08-16 20:41:31
【问题描述】:

双向数据绑定不会在组件之间更新

我正在使用两种方式数据绑定设置组件间通信。我有一个父控制器,它从 AJAX 调用中获取数据并将该数据发送到 2 个组件。

我尝试修改传递给组件的数据,但如果 child1 组件更新数据,尽管存在双向数据绑定,但子组件不会获取更新数据。我读到 $onChanges 钩子不会捕获双向数据绑定的更改事件。

<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 组件中获取更新的数据,反之亦然。

【问题讨论】:

  • 执行 XHR 的函数无法返回数据。它们只能返回需要从中提取数据的 Promise。

标签: angularjs angularjs-components angularjs-1.5


【解决方案1】:

$onChanges life-cycle hook 仅在更改单向 ("&lt;") 和属性 ("@") 绑定时触发。它不会在双向 ("=") 绑定更改时触发。

对于组件,对输入使用单向 ("&lt;") 绑定,对输出使用表达式 ("&amp;") 绑定:

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 的函数无法返回数据。它们只能返回需要从中提取数据的 Promise。

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 的看法。

【讨论】:

  • 如果有多个组件,并且每个组件都应该获取更新的数据,如果任何组件更新了它怎么办?
  • 阅读Angular 2+ Developer Guide - Template Syntax - Two-way binding。该指南展示了 Angular 2+ 如何进行双向绑定。如果 AngularJS 组件是这样完成的,那么迁移到 Angular 2+ 会容易得多。
猜你喜欢
  • 2019-01-28
  • 2016-02-27
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多