在我的控制器的原始版本中,我在dom中添加了一个标题徽标,然后在调用函数时能够删除并用其他东西替换它,就像这样
$scope.addHeader('.blahClassName');
$scope.removeHeaderFunction = function(){
$('.blahClassName).html('');
//do other stuff
}
这很好用。但是,我读到最好不要在控制器中进行DOM操作,因此我创建了一个像这样的指令
<div class='MyCtrl as vm'>
<div header-dir myscope="vm" removeheaderflag="{{vm.headerflag}}"></div>
然后,在我的指令的链接功能中,我添加标题徽标并侦听标记中的更改以将其删除,就像这样
link: function(scope, elem, attrs){
scope.myscope.addHeader('.blahClassName'); //calling the function addHeader on the controller available through myscope
attrs.$observe('removeheaderflag', function(){
angular.element(elem[0].querySelector('.blahClassName')).html('');
});
}
然后在控制器中,我在页面加载时设置$scope.headerflag = null;
,并在removeHeaerFunction
中将其设置为true,意图只有在标志设置为true时才会删除标头
$scope.removeHeaderFunction = function(){
$scope.headerflag = true;
}
但是,我的代码的实际行为是无论$scope.headerflag
设置为什么,都会立即添加和删除徽标。换句话说,$attrs.observe('removeheaderflag', ...
内的代码会立即运行。
问题:如何延迟在该观察者中运行代码或以其他方式从指令中获取我想要的行为,即基本上能够在点击事件中删除某些内容
答案 0 :(得分:2)
$observe
与$watch
的工作方式相同,这两者之间的唯一区别是$observe
适用于插值表达式{{}}
,而$watch
适用于范围值作为字符串。
目前发生的情况是$observe
函数在变量removeheaderflag
从undefined
到null
时被调用,因此在这种情况下,$observe
回调函数正在获取已调用并且您的blahClassName
类已从DOM中删除。要限制此行为,您应添加条件,以便在removeheaderflag
将值更改为true
时调用所需的代码
<强>代码强>
attrs.$observe('removeheaderflag', function(newVal, oldValue){
if(newVal) //this will check values in not null & not false
angular.element(elem[0].querySelector('.blahClassName')).html('');
});
答案 1 :(得分:2)
您是否可以检查$observe
中返回的值是否为您希望的值,在这种情况下,true
?请注意以下更改......
attrs.$observe('removeheaderflag', function(value) { // -- we know this
if(value) {
angular.element(elem[0].querySelector('.blahClassName')).html('');
}
});
此外,根据评论中的讨论,您可以采取其他方法。由于您的DOM操作很简单(在此示例中),利用ngClass并允许CSS为我们处理此问题可能是一个可行的解决方案。为什么不将headerflag
绑定到具有display: none
规则的类?一个例子可能包括......(这里有一个关于标记的例子)......
<header class="blahClassName" ng-class="{'remove': headerflag}">header</header>
.remove {
display: none;
}
$scope.remove = function() {
$scope.headerflag = true;
}
JSFiddle Link - 使用ngClass
的示例ngIf等其他方法也适用于此。也许您不需要自定义指令来完成此任务。