Ответ 1
UPDATE
Способ сделать это - создать новую область для элемента с такой директивой.
yourModule.directive('unbindable', function(){
return { scope: true };
});
И примените его к вашему элементу так:
<div unbindable id="yourId"></div>
Затем, чтобы отменить этот элемент из любых обновлений, вы это сделаете.
angular.element( document.getElementById('yourId') ).scope().$destroy();
Готово, вот демо.
Демо: http://jsfiddle.net/KQD6H/
Таким образом, это создает новую область для элемента и работает только потому, что все области наследуют все данные из своих родительских областей. поэтому область действия в основном такая же, как и родительская область, но позволяет уничтожить область действия, не затрагивая родительскую область. Поскольку этому элементу была предоставлена собственная область действия, когда вы его уничтожаете, он не возвращает родительскую область как все остальные элементы, если это имеет смысл 0.o
Все, что было ниже этой строки, было моим первоначальным ответом, я оставлю это здесь, если кто-то предпочитает этот способ
Мне удалось достичь этой цели с помощью директивы unbindable
.
Когда у вас есть директива unbinable
, настроенная на элементе, все, что требуется для развязывания элемента, это.
yourElement.attr('unbind', 'true'); // Ref 1
$scope.$broadcast('unbind'); // Ref 2
Вот директива.
app.directive('unbindable', function(){
return {
scope: true, // This is what lets us do the magic.
controller: function( $scope, $element){
$scope.$on('unbind', function(){ // Ref 3
if($element.attr('unbind') === 'true'){ // Ref 4
window.setTimeout(function(){ $scope.$destroy() }, 0);//Ref 5
}
});
}
}
});
и вы установите свой элемент таким образом.
<h1 unbindable></h1>
Поэтому всякий раз, когда вы добавляете атрибут unbind="true"
в h1
и широковещательный unbind
, элемент будет unbind-ed
REF-1: Добавьте атрибут unbind true к элементу, чтобы директива узнала, какой элемент вы отключаете.
REF-2: Широковещать событие unbind по всем областям, чтобы директива знала, что вы хотите развязать элемент. Убедитесь, что вы сначала добавили атрибут. --- В зависимости от вашего макета приложения вам может потребоваться использовать
$rootScope.$broadcast
REF-3: когда передается событие unbind
REF-4. Если элемент, связанный с директивой, имеет истинный атрибут unbind
REF-5. Затем уничтожьте область действия, заданную директивой. Мы должны использовать
setTimeout
, потому что я думаю, что angular пытается что-то сделать после события$on
, и мы получаем ошибку, поэтому использованиеsetTimeout
предотвратит эту ошибку. Хотя он срабатывает мгновенно.
Это работает с несколькими элементами, вот хорошая демонстрация.