2016-05-13 10 views
1

a値を変更する責任を負う独立したスコープを持つ簡単なディレクティブがあります。破壊されたら、値を未定義に設定します。ただし、destroy関数の変更は変更を伝播しません。

ここにコードがあります。 そして再び問題は、私はproblemを実証するためのplunkerを作っOUTDATAが

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

この範囲外で「未定義」に設定されていないということです。 これはバグですか?もしそうでなければ、 '$ preDestroy'イベントがありますか?

答えて

0

は$ brodcastどうやら角度$破壊関数内からイベントを破棄し、それを返す前に、それは両方の設定:この方法では、link機能でngModelControllerを注入し、外の値を更新するためのメソッドを使用することができます$ applyと$ digestをnoopsに適用します。意味の変更はダイジェストサイクルで気付くことができません(私の理解が行く限り)。 私はそう

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); 
    } 
} 

のような親スコープに実際のオブジェクトを評価して、$破壊イベントでそれを呼び出すことにより、setterメソッドを作成することになりました。

!OBS!あなたは

<tvx-select ng-model="anyObject.value" ... />

それは私がちょうど1以上のものを持っているので、私のために動作しません

<tvx-select ng-model="value" ... />

0

ここでの問題は、outDataの値/参照をundefinedに変更しており、これ以上外部の値ではないためです。ディレクティブに新しいスコープを宣言することなく、ディレクティブにngModelControllerを使用できます。

あなたが言及したPlunkerの例のディレクティブでは、scopeプロパティを削除し、require: ngModelを追加することができます。

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(); 
      }); 
     } 
    } 
}) 
+0

このソリューションでは動作しませんあなたのNG-モデルにオブジェクトを使用する場合にのみ動作します/ outパラメータ。彼らはすべてがモデルになるわけではありませんでした。 – Kindergart

関連する問題