В частности, в вашем случае директивы, которая работает с ng-if
и использует require: "ngModel"
, вы могли бы сделать:
scope.$on("$destroy", function(){
ngModel.$setViewValue(undefined);
}
Только одна вещь, чтобы отметить здесь:
scope.$on("$destroy")
работает, когда сфера уничтожен - не всегда, когда элемент «уничтожен» (или удален из DOM). В вашем случае это работает, поскольку ng-if
создает дочернюю область, однако вполне возможно, что элемент удаляется другой директивой без той области действия, в которой он «жил», что он уничтожается. В этом случае вы можете использовать elem.on("$destroy")
.
EDIT:
Действительно, как было отмечено в комментариях, это не снимает фактический ключ - просто устанавливает значение этого ключа. Если вы думаете об этом, это правильная вещь, потому что ключ может быть функцией setter (ngModel
supports 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];
}
})
Спасибо! который устанавливает значение undefined. Поэтому, когда мы видим вывод, он будет _ {x: 6; y: undefined} _, но я смотрел, как-то мы можем удалить элемент Y из самой модели. т.е. выводить как _ {x: 6} _ и делать это не только для y, но и для каждого элемента, к которому привязана эта директива. Надеюсь, у меня есть смысл ... –
@NarainMittal, очевидно, вы не пробовали - это удалит свойство –
На самом деле я сделал это, прежде чем комментировать, и обновил планку с вашим решением. Вы можете посмотреть. –