Мы имеем следующую директиву:
.directive("directiveToggleElement", function(FlagsService) {
return {
restrict: "E",
scope: {},
link: function(scope, element, attrs)
{
scope.showMe = FlagsService.isOn(attrs.toggleKey);
scope.featureText = attrs.featureText;
var htmlTag = '<div class="panel ng-scope" ng-class="{selected: selected}" ng-click="selected = !selected;"></div>';
var htmlComment = '<!-- TogglePlaceholder: ' + attrs.toggleKey +'-->';
element.replaceWith(scope.showMe ? htmlComment + htmlTag : htmlComment);
// Listen for change broadcast from flagsservice to toggle local store
scope.$on('LocalStorage.ToggleChangeEvent.' + attrs.toggleKey, function(event, parameters) {
console.log('stuff changed - ' + parameters.key + ' ' + parameters.newValue);
scope.showMe = parameters.newValue;
element.replaceWith(scope.showMe ? htmlComment + htmlTag : htmlComment);
});
}
}
})
Идея заключается в том, что на основе стоимости функция переключения (или флаг функция) директива будет выводить комментарий с тегом или просто комментарий.
Исходный элемент.replaceWith работает так, как ожидалось, но вызов изнутри области. $ On генерирует «TypeError: не может вызвать метод« replaceChild »из null». Мы проверяли элемент перед каждым вызовом и не можем обнаружить очевидную разницу.
Может ли кто-нибудь объяснить, почему здесь была ошибка, или сообщить о возможном обходном пути, который позволит нам сделать то же самое?
Мы имеем рабочую директиву, которая устанавливает значение нг-шоу:
.directive("directiveToggle", function(FlagsService) {
return {
restrict: "A",
transclude: true,
scope: {},
link: function(scope, element, attrs)
{
scope.showMe = FlagsService.isOn(attrs.toggleKey);
// Listen for change broadcast from flagsservice to toggle local store
scope.$on('LocalStorage.ToggleChangeEvent.' + attrs.toggleKey, function(event, parameters) {
console.log('stuff changed - ' + parameters.key + ' ' + parameters.newValue);
scope.showMe = parameters.newValue;
});
},
template: '<div class="panel ng-scope" ng-show="showMe" ng-class="{selected: selected}" ng-click="selected = !selected;"><span ng-transclude></span></div>',
replace: true
}
})
Но мы предпочли бы, чтобы удалить элемент из DOM вместо установки дисплея нет.
Мне нужно только удалить его из DOM, почему бы не использовать 'ngIf' ?. Просьба предоставить плункер. –
Привет @Ilan, хотя ngIf будет (и работает), мы намеренно избегаем вызова нашего флага с контроллера - я создам рабочую онлайн-демонстрацию – kevinawalker