为什么绑定值在控制器中不能立即以角度显示

时间:2017-01-20 03:45:25

标签: angularjs

我试图在控制器代码可用的角度1.6组件中绑定一些值。

我一定是误解了它,但是当控制器运行时变量是不可用的。我管理它的唯一方法是将$ timeout插入到下一个摘要周期中。

我在这里做错了什么?

相关部分如下:

var SelectorCtrl = ['$scope', '$http', '$timeout',
  function ($scope, $http, $timeout) {
    var self = this;
    alert("1: " + self.hierarchyId);

    // I'm not 100% sure why this has to be in the next digest cycle
    $timeout(function(){
      $scope.categories = self.categories;
      alert("2: " + self.hierarchyId);

    });
}

app.component('categorySelector', {
  templateUrl: 'categorySelector.html',
  controller: SelectorCtrl,
  bindings: {
    hierarchyId: "@",
    disabled: "=",
    categories: "=",
    onSelectionChanged: "&"
  }
});

请参阅plunker:https://plnkr.co/edit/8rtDuCawdHaiXzQU5VBR

1 个答案:

答案 0 :(得分:7)

这是因为Angular 1.6中引入了project_B,您可以在$compileProvider.preAssignBindingsEnabled(flag)上的配置周期配置它

  

如果禁用(false),编译器会先调用构造函数   分配绑定。

     

Angular 1.5.x中的默认值为true,但将切换为false   Angular 1.6.x。

您将获得Angular组件的$compileProvider生命周期事件中的所有绑定,其中所有绑定都可用(如果绑定同步传递)。

$onInit
  

注意:self.$onInit = function() { $scope.categories = self.categories; alert("2: " + self.hierarchyId); }; $scope混合是一种不好的做法。而是避免使用this使您的代码成为Angular 2迁移证明。

如果要在控制器功能实例化时使绑定可用,则可以设置$scope。这将使$compileProvider.preAssignBindingsEnabled(true)(绑定)值。

self.categories

Similar answer

Angular 1.7.x更新

从Angular 1.7.x开始,app.config(function($compileProvider){ $compileProvider.preAssignBindingsEnabled(true) }); 消失了,不再可能在构造函数之前分配绑定。

要解决此问题,您需要在指令定义中定义$compileProvider.preAssignBindingsEnabled(flag)函数。你可以让这个函数在你的控制器上调用一个方法,如下所示:

link