将 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