我试图在控制器代码可用的角度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
答案 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
从Angular 1.7.x开始,app.config(function($compileProvider){
$compileProvider.preAssignBindingsEnabled(true)
});
消失了,不再可能在构造函数之前分配绑定。
要解决此问题,您需要在指令定义中定义$compileProvider.preAssignBindingsEnabled(flag)
函数。你可以让这个函数在你的控制器上调用一个方法,如下所示:
link