将 AngularJs 1.5 升级到 1.6 - $compile reg 控制器实例的更改会影响哪些确切的绑定?

Posted

技术标签:

【中文标题】将 AngularJs 1.5 升级到 1.6 - $compile reg 控制器实例的更改会影响哪些确切的绑定?【英文标题】:Upgrade AngularJs 1.5 to 1.6 - which exact bindings are affected by change in $compile reg controller instances? 【发布时间】:2018-12-18 20:11:18 【问题描述】:

Documentation 在从 AngularJs 1.5 升级到 1.6 状态时更改 $compile:

默认情况下禁用组件/指令控制器实例上的预分配绑定,这意味着它们将不再在构造函数中可用。

— AngularJS Developer Guide - Migrating to V1.6 - $compile

文档中的升级示例如下(略):

之前

.component('myComponent', 
  bindings: value: '<',
  controller: function() 
    //...
  
)

之后

.component('myComponent', 
  bindings: value: '<',
  controller: function() 
    this.$onInit = function() 
      // ...
    ;
  
)

我已经发现对于使用 bindToController: true 的任何指令,我必须使用相同的 $onInit 函数,如下所示:

.directive('acAllocation', acAllocation);

  function acAllocation(SomeService) 
    return 
      restrict: 'E',
      replace: true,
      scope: 
        allocation: '=acAllocation'
      ,
      controller: acAllocationController,
      controllerAs: 'vm',
      bindToController: true,
      templateUrl: 'path/acAllocation.html'
    ;

    function acAllocationController() 

      var vm = this;

      this.$onInit = function ()  //...

是否有任何其他类型的绑定受此更改影响?

或者用bindToController:true处理组件指令就足够了吗?

重新表述相同的问题:在 Angular 1.7 应用程序中,仅使用 带有 bindToController: false 的指令:我可以面对任何关于预分配绑定的问题吗?

【问题讨论】:

请注意,AngularJS 团队建议避免使用 replace: true 属性。有关详细信息,请参阅Why is replace property deprecated in AngularJS directives?。 应该避免使用= 进行双向绑定。它使迁移到 Angular 2+ 变得困难。有关详细信息,请参阅AngularJS Developer Guide - Component-based application architecture。 简短的回答是它会影响所有隔离范围绑定,无论它们是绑定到范围还是控制器。稍后我会写一个更深入的答案。 谢谢,不胜感激。但是我们很久以前就开始了应用程序,并且在 LTS 支持期间将继续使用 1.x。 【参考方案1】:

调用 $onInit() 生命周期方法时,绑定完成。这是唯一的保证。假设构造函数中的值可用已不再安全,这会影响整个应用程序。

我建议迁移到 1.5 样式组件和 ES6,以便将来更容易迁移。

【讨论】:

以上是关于将 AngularJs 1.5 升级到 1.6 - $compile reg 控制器实例的更改会影响哪些确切的绑定?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 1.6 升级代码以登录不再使用 REST?

AngularJS1.6版本中ui-router路由中/#!/的解决方法 - zhuan

AngularJS 绑定问题

AngularJS 1.6 + ES6 - 将jquery ui-grid回调数据返回到控制器[重复]

joomla 组件 1.5 到 joomla 组件 1.6

AngularJS 1.6 + ES6 - $doCheck 被调用两次