12

随着 AngularJS V1.7 的发布,预先分配绑定到的选项已被弃用和删除:

由于38f8c9构造函数中不再提供指令绑定

要迁移您的代码:

  • 如果您指定$compileProvider.preAssignBindingsEnabled(true),您需要首先迁移您的代码,以便可以将标志翻转为false. “从 1.5 迁移到 1.6”指南中提供了有关如何执行此操作的说明 。之后,删除该$compileProvider.preAssignBindingsEnabled(true)语句。

AngularJS 开发者指南 - 迁移到 V1.7 - 编译

由于bcd0d4,默认情况下禁用控制器实例上的预分配绑定。 我们强烈建议尽快迁移您的应用程序以使其不再依赖它。

依赖于存在绑定的初始化逻辑应该放在控制器的$onInit()方法中,保证总是在绑定分配后调用。

AngularJS 开发人员指南 - 从 v1.5 迁移到 v1.6 - $compile

当代码必须移动到$onInitLife-Cycle Hook时,有哪些用例?我们什么时候可以将代码留在控制器构造函数中?

4

1 回答 1

10

当代码依赖于绑定时,必须在函数中移动代码,因为这些绑定在构造函数$onInit中不可用。this它们在组件类的实例化之后被分配。

示例:您有这样的状态定义:

$stateProvider.state("app", {
  url: "/",
  views: {
    "indexView": {
      component: "category"
    }
  },
  resolve: {
    myResolve: (someService) => {
      return someService.getData();
    }
  }
});

您可以myResolve像这样将结果绑定到您的组件:

export const CategoryComponent = {
  bindings: {
    myResolve: "<"
  },
  controller: Category
};

如果您现在注销并登录,this.myResolve您将看到如下内容:constructor$onInit

constructor() {
  console.log(this.myResolve); // <-- undefined
}

$onInit() {
  console.log(this.myResolve); // <-- result of your resolve
}

因此,您的构造函数应该只包含如下构造代码:

constructor() {
  this.myArray = [];
  this.myString = "";
}

每个角度特定的初始化和绑定或依赖项使用都应该在$onInit

于 2018-07-20T13:23:16.203 回答