我有一个带有隔离范围的简单指令,负责更改一个值。当它被销毁时,我希望将值设置为undefined。但是,销毁功能的变化并不会传播变化。
这是代码。 而且问题是outData未设置为“未定义”'超出此范围
scope: {
outData: '=ngModel',
},
link: function (scope, elem, attars) {
scope.$on('$destroy', function () {
scope.outData = undefined;
})
}
我做了一个以展示problem的人。 这是一个错误吗?如果没有,是否有' $ preDestroy'要听的事件?
答案 0 :(得分:0)
这里的问题是因为您要将outData
的值/引用更改为undefined
而不是外部值。您可以在指令中使用ngModelController,而无需在指令中声明新范围。
在您提到的Plunker示例的指令中,您可以删除scope
属性并添加require: ngModel
。通过这种方式,您可以在ngModelController
函数中注入link
并使用方法更新外部值:
app.directive('tvxSelect', function () {
return {
restrict: 'E',
require: 'ngModel',
template: '<select ng-model="intern">' +
'<option value="nothing" selected>nothing<option>' +
'<option value="forbidden">DONT SELECT<option>' +
'</select>',
link: function (scope, elem, attars, ngModelCtrl) {
scope.$watch('intern', function (newVal) {
ngModelCtrl.$setViewValue(newVal);
ngModelCtrl.$commitViewValue();
});
scope.$on('$destroy', function () {
ngModelCtrl.$setViewValue('I TOLD YOU NOT TO SELECT');
ngModelCtrl.$commitViewValue();
});
}
}
})
答案 1 :(得分:0)
显然,角度brodcast来自$ destroy函数内部的$ destroy事件,在它返回之前,它将$ apply和$ digest设置为noops。在摘要周期中无法注意到含义的变化(据我所知)。 我最后通过评估父作用域上的实际对象来创建一个setter方法,如此
link: function (scope, elem, attrs, ngModelCtrl) {
var dotPos = attrs.ngModel.lastIndexOf('.');
var objString = attrs.ngModel.substr(0,dotPos);
var paramString = attrs.ngModel.substr(dotPos+1,attrs.ngModel.length);
var object = scope.$parent.$eval(objString);
function setModel(val){
object[paramString] = val
}
scope.$on('$destroy', function () {
setModel(undefined);
}
}
然后在$ destroy事件中调用它。
!OBS!这仅在您使用ng-model
上的对象时才有效 <tvx-select ng-model="anyObject.value" ... />
它不适用于
<tvx-select ng-model="value" ... />