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: