2015-05-15 1 views
2

Моя проблема аналогична той, что описана в this question. Это работает, когда мы знаем переменную области для удаления. Однако я ищу что-то общее, например удалить переменную для всех элементов, к которым прикреплена эта директива, всякий раз, когда они становятся скрытыми. Я попытался ввести ngModel и попытался установить значение null или delete, похоже, не работает.

Это то, что я пытаюсь, чтобы: plunk

myModule.directive('destroyY', function(){ 
     return{ 
      restrict:'A', 
      require: '?ngModel', 
      link: function(scope, elem, attrs, ngModel) { 

      scope.$on('$destroy', function(){ 
      console.log(ngModel); 

      ngModel=null; // doesn't work 
      delete ngModel; // doesn't work 

      }) 
      } 
     } 
     }); 

Любая помощь очень ценится. Благодаря!

ответ

2

В частности, в вашем случае директивы, которая работает с ng-if и использует require: "ngModel", вы могли бы сделать:

scope.$on("$destroy", function(){ 
    ngModel.$setViewValue(undefined); 
} 

Только одна вещь, чтобы отметить здесь:

scope.$on("$destroy") работает, когда сфера уничтожен - не всегда, когда элемент «уничтожен» (или удален из DOM). В вашем случае это работает, поскольку ng-if создает дочернюю область, однако вполне возможно, что элемент удаляется другой директивой без той области действия, в которой он «жил», что он уничтожается. В этом случае вы можете использовать elem.on("$destroy").

EDIT:

Действительно, как было отмечено в комментариях, это не снимает фактический ключ - просто устанавливает значение этого ключа. Если вы думаете об этом, это правильная вещь, потому что ключ может быть функцией setter (ngModelsupports setter/getter functions).

Несмотря на то, что я рекомендую в этом случае, вы могли бы все еще удалить свойство из области действия, хотя это уродливый подход, который, очевидно, не обслуживается Angular.

Вам необходимо получить выражение родительского объекта (например, form) и его выражение свойства (например, y), а затем удалить свойство. Обратите внимание, что если нет точечной нотации ("."), тогда ngModel установил бы значение в области, подлежащей уничтожению, и поэтому мы позаботимся об этом. Для этого вам необходимо будет использовать $parse:

var modelExp = attrs.ngModel; 
var idxOfDot = modelExp.lastIndexOf("."); 
var parentExp = modelExp.substring(0, idxOfDot); 
var propExp = modelExp.substring(idxOfDot + 1); 

var parsedParentExp = $parse(parentExp); 

scope.$on("$destroy", function(){ 
    var p = parsedParentExp(scope); 
    if (p){ 
     delete p[propExp]; 
    } 
}) 
+0

Спасибо! который устанавливает значение undefined. Поэтому, когда мы видим вывод, он будет _ {x: 6; y: undefined} _, но я смотрел, как-то мы можем удалить элемент Y из самой модели. т.е. выводить как _ {x: 6} _ и делать это не только для y, но и для каждого элемента, к которому привязана эта директива. Надеюсь, у меня есть смысл ... –

+0

@NarainMittal, очевидно, вы не пробовали - это удалит свойство –

+0

На самом деле я сделал это, прежде чем комментировать, и обновил планку с вашим решением. Вы можете посмотреть. –