早上好,
我遇到了一个我写过的新组件的问题,其中一个值没有传递给控制器,我怎么想象它会。
所以让我们拿这个组件声明,你可以看到我传入两个字符串和一个对象,该对象等同于父控制器的一个数字。让我们假设'url'和'pagesize'都已经很好地工作了 - 他们这样做:)
<paging url="/myurl.html" pagesize="10" numberofitems="ctrl.mynumber"></paging>
你可以看到我在这里创建了一个新模块,目前只显示一个段落标签,其中显示了数字'ctrl.numberofitems'变量。重要的是要知道这是有效的,并且值正确显示。
angular.module('PagingModule', [])
.component('paging', {
scope: {},
controllerAs: 'ctrl',
bindings: {
url: '@',
pagesize: '@',
numberofitems: '='
},
controller: pagingController,
template: '<p>{{ctrl.numberofitems}}</p>'
});
function pagingController() {
var vm = this;
$scope.$watch("ctrl.numberofitems", function (val) { //ADDED THE WATCH AND CAN NOW SEE THE VALUE UNDEFINED, THEN POPULATED CORRECTLY
console.log(val);
});
}
当我尝试引用'vm.numberofitems'时,我收到未定义的吗? 'pagesize'和'url'在这一点上都是完全可访问和填充的。
编辑:现在,如果我参考上面显示的$ scope.watch,我可以访问从我的控制器推入的值 - 我现在注意的是,值是UNDEFINED,然后当服务的承诺得到解决,它会更改为实际的列表本身。现在问题发生了变化:)为什么我要做这个$ watch?它似乎完全矫枉过正,显然很昂贵;我只是错过了一个我可以使用的非常明显的模式吗?
再次感谢
答案 0 :(得分:1)
尝试等待$onInit
。
在实例化控制器之后,隔离范围绑定的初始值将绑定到控制器属性。通过提供一个名为
$onInit
的控制器方法,可以在初始化这些绑定后访问它们,该方法在构造了元素上的所有控制器并初始化其绑定后调用。
- https://docs.angularjs.org/api/ng/service/$compile#-bindtocontroller-
接下来要做的就是放一个$watch
。
$scope.$watch("ctrl.numberofitems", function(newValue) {
console.log(newValue);
});
如果视图可以看到它,手表应该看到它。