Angularjs 如何在具有隔离作用域的指令上使用ng show
我有一个指令,我是这样使用的:Angularjs 如何在具有隔离作用域的指令上使用ng show,angularjs,Angularjs,我有一个指令,我是这样使用的: <dir model="data"></dir> <dir ng-show="show" model="data"></dir> <dir ng-show="$parent.show" model="data"></dir> 现在,我尝试使用页面$scope的另一个属性在该指令上使用ng show,如下所示: <dir model="data"></dir> &
<dir model="data"></dir>
<dir ng-show="show" model="data"></dir>
<dir ng-show="$parent.show" model="data"></dir>
现在,我尝试使用页面$scope的另一个属性在该指令上使用ng show
,如下所示:
<dir model="data"></dir>
<dir ng-show="show" model="data"></dir>
<dir ng-show="$parent.show" model="data"></dir>
有更好的方法吗
请参阅此链接:更新:此答案适用于1.2之前的Angular版本。参见@lex82的答案,了解角度1.2 因为
dir
指令创建了一个隔离作用域,所以在同一元素上定义的所有指令(在本例中为dir
)都将使用该隔离作用域。这就是为什么ng show
在隔离作用域而不是父作用域上查找属性show
如果您的dir
指令确实是一个,因此它应该使用一个隔离作用域,那么您的包装解决方案可能是最好的(比使用$parent
,IMO更好),因为这样的指令通常不应该与同一元素上的其他指令一起使用(或者您正好遇到这种问题)
如果您的指令不需要隔离作用域,您的问题就会消失。将以下内容添加到链接函数中可以解决问题。对于组件创建者来说,这是一个额外的步骤,但会使组件更直观
function link($scope, $element, attr, ctrl) {
if (attr.hasOwnProperty("ngShow")) {
function ngShow() {
if ($scope.ngShow === true) {
$element.show();
}
else if($scope.ngShow === false) {
$element.hide();
}
}
$scope.$watch("ngShow", ngShow);
setTimeout(ngShow, 0);
}
//... more in the link function
}
您还需要为ngShow设置范围绑定
scope: {
ngShow: "="
}
只需对父范围使用
$parent
,如下所示:
<dir model="data"></dir>
<dir ng-show="show" model="data"></dir>
<dir ng-show="$parent.show" model="data"></dir>
免责声明
我认为这是对你问题的准确回答,但我承认,从美学角度来看,这并不完美。然而,包装
也不是很好。我认为可以证明这一点,因为从传递给隔离作用域的另一个参数可以看出,该指令实际上有一个隔离作用域。另一方面,我必须承认,我一开始经常忘记$parent,然后想知道为什么它不起作用
当然,添加一个附加属性is visible=“expression”
并在内部插入ng show
会更清晰。但你在问题中说你试图避免这个解决方案
<强>更新:不会在角度1.2或更高的情况下工作。
< P>可以考虑迁移到1.2或更高的角度。这意味着ng show不再受您的指令的影响,您可以完全按照最初尝试的方式编写:<dir ng-show="show" model="data"></dir>
@角度开发者:干得好,伙计们 您是否尝试将指令的优先级更改为在
ngShow
之前/之后?@r3m0t:优先级似乎不会影响此操作。我试过-10000和10000。它确实有效。参见此处使用的相同plnkr w/1.2: