我正在编写Angular 1.5指令,并且在绑定数据存在之前尝试操作绑定数据时遇到了一个令人讨厌的问题。
这是我的代码:
app.component('formSelector', {
bindings: {
forms: '='
},
controller: function(FormSvc) {
var ctrl = this
this.favorites = []
FormSvc.GetFavorites()
.then(function(results) {
ctrl.favorites = results
for (var i = 0; i < ctrl.favorites.length; i++) {
for (var j = 0; j < ctrl.forms.length; j++) {
if (ctrl.favorites[i].id == ctrl.newForms[j].id) ctrl.forms[j].favorite = true
}
}
})
}
...
如您所见,我正在进行AJAX调用以获取收藏夹,然后将其与表单的绑定列表进行对照。
问题是,即使在绑定尚未填充之前,promise仍在兑现...因此,在我运行循环时,ctrl.forms仍未定义!
在不使用$ scope。$ watch(这是1.5个组件的吸引力的一部分)的情况下,如何等待绑定完成?
您可以使用新的生命周期挂钩(具体而言)$onChanges
,通过调用isFirstChange
方法来检测绑定的第一次更改。在此处阅读有关此内容的更多信息。
这是一个例子:
<div ng-app="app" ng-controller="MyCtrl as $ctrl">
<my-component binding="$ctrl.binding"></my-component>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js"></script>
<script>
angular
.module('app', [])
.controller('MyCtrl', function($timeout) {
$timeout(() => {
this.binding = 'first value';
}, 750);
$timeout(() => {
this.binding = 'second value';
}, 1500);
})
.component('myComponent', {
bindings: {
binding: '<'
},
controller: function() {
// Use es6 destructuring to extract exactly what we need
this.$onChanges = function({binding}) {
if (angular.isDefined(binding)) {
console.log({
currentValue: binding.currentValue,
isFirstChange: binding.isFirstChange()
});
}
}
}
});
</script>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句