AngularJS,$ destroy事件不会传播双绑定参数的更改

时间:2016-05-13 07:37:50

标签: angularjs angularjs-directive angularjs-scope

我有一个带有隔离范围的简单指令,负责更改一个值。当它被销毁时,我希望将值设置为undefined。但是,销毁功能的变化并不会传播变化。

这是代码。 而且问题是outData未设置为“未定义”'超出此范围

scope: {
    outData: '=ngModel',
},
link: function (scope, elem, attars) {
            scope.$on('$destroy', function () {
                scope.outData = undefined;
            })
}

我做了一个以展示problem的人。 这是一个错误吗?如果没有,是否有' $ preDestroy'要听的事件?

2 个答案:

答案 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" ... />