AngularJS升级(1.5到1.6,1.7)使指令范围绑定未定义

AngularJS升级(1.5到1.6,1.7)使指令范围绑定未定义,angularjs,angular-directive,angular-controller,angularjs-1.6,Angularjs,Angular Directive,Angular Controller,Angularjs 1.6,我有以下代码: angular .module('myApp') .directive('layout', function () { return { restrict: 'E', template: '<div ng-include="layoutCtrl.pageLayout"></div>', controller: 'LayoutController', cont

我有以下代码:

angular
  .module('myApp')
  .directive('layout', function () {
      return {
          restrict: 'E',
          template: '<div ng-include="layoutCtrl.pageLayout"></div>',
          controller: 'LayoutController',
          controllerAs: 'layoutCtrl',
          bindToController: true,
          scope: {
              pageLayout: '=',
              pageConfiguration: '=',
              isPreview: '='
          }
      };
  });

angular
  .module('myApp')
  .controller('LayoutController', LayoutController);

function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    self.layoutDTO = LayoutDTO;
    self.layoutPreviewDTO = LayoutPreviewDTO;
    var test = $scope;

    if(self.isPreview)
        self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
    else
        self.layoutModel = new self.layoutDTO(self.pageConfiguration);
}


<div>
    <layout page-layout="ctrl.layoutTemplateUrl" page-configuration="ctrl.pageConfiguration" is-preview="false"></layout>
</div>
angular
.module('myApp')
.directive('layout',function(){
返回{
限制:'E',
模板:“”,
控制器:“LayoutController”,
controllerAs:'layoutCtrl',
bindToController:对,
范围:{
页面布局:'=',
页面配置:'=',
isPreview:“=”
}
};
});
有棱角的
.module('myApp')
.控制器(“LayoutController”,LayoutController);
函数LayoutController($scope、LayoutDTO、LayoutPreviewTo){
var self=这个;
self.layoutDTO=layoutDTO;
self.layoutPreviewTo=layoutPreviewTo;
var测试=$scope;
if(self.isPreview)
self.layoutModel=新建self.layoutPreviewDTO(self.pageConfiguration);
其他的
self.layoutModel=新self.layoutDTO(self.pageConfiguration);
}

在angular 1.5.3版本中,这正如预期的那样工作,控制器中的变量带有值。现在,自从我升级到1.6.x之后,self.pageConfiguration现在还没有定义

除了角度版本外,没有任何更改

如何在控制器中获取传入指令的值的句柄?

我找到了:

现在默认为false,必须设置为true
$compileProvider.preAssignBindingsEnabled(true)

AngularJS团队建议将依赖于范围绑定的控制器代码移动到
$onInit
函数中

function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    this.$onInit = function () {
        // bindings will always be available here
        // regardless of the value of `preAssignBindingsEnabled`.
        self.layoutDTO = LayoutDTO;
        self.layoutPreviewDTO = LayoutPreviewDTO;
        var test = $scope;

        if(self.isPreview)
            self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
        else
            self.layoutModel = new self.layoutDTO(self.pageConfiguration);
    };
}
$compile:

由于的原因,默认情况下禁用控制器实例上的预分配绑定。仍然可以重新打开它,这在迁移过程中应该会有所帮助。预分配绑定已被弃用,并将在将来的版本中删除,因此我们强烈建议尽快迁移您的应用程序,不要依赖它。

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


更新
已从AngularJS V1.7中删除了
$compileProvider.preAssignBindingsEnabled
标志

AngularJS团队强烈建议尽快迁移您的应用程序,不要依赖它。AngularJS V1.6版将于2018年7月1日到期

从文档中:

由于,指令绑定在构造函数中不再可用

以前,支持
$compileProvider.preAssignBindingsEnabled
标志。该标志控制绑定是在控制器构造函数内部可用,还是仅在
$onInit
钩子中可用。绑定现在在构造函数中不再可用

要迁移代码,请执行以下操作:

  • 如果指定了
    $compileProvider.preAssignBindingsEnabled(true)
    ,则需要首先迁移代码,以便将标志翻转到
    false
    。中提供了有关如何执行此操作的说明。然后,删除
    $compileProvider.preAssignBindingsEnabled(true)
    语句

注:
2018年7月1日,AngularJS 1.6的支持结束。有关更多信息,请参阅。

是否已检查角度更改日志,以查看是否有可能导致此代码“无法工作”的中断更改?到底是什么不起作用-你会得到什么错误?您是否也将其他
ng
本机模块更新为同一版本的angular?self.pageConfiguration现在是“未定义”的,而不是我从html传递的值。不幸的是,这太广泛了。你能编一把小提琴再现这个问题吗?因为在不知道如何调用此指令的情况下很难进行调试,等等。问题标签下有一个
编辑
链接-单击它并更新答案OK,我将在将来的版本中记住这一点,谢谢你给我指这个article@drabbitharv您应该将此标记为正确答案。如果您试图遵循迁移路径,这是一个坏主意,因为所做的只是将其切换回1.5。正如@georgeawg所提到的,您应该使用$onInit()来更正绑定,
$compileProvider.preAssignBindingsEnabled
标志已从AngularJS V1.7中删除。