【问题标题】:Angularjs - toggle element visibility within directive by clicking a different element in the same directiveAngularjs - 通过单击同一指令中的不同元素来切换指令内的元素可见性
【发布时间】:2014-01-29 03:35:41
【问题描述】:

我一直试图弄清楚这一点并进行了一些搜索,但我发现的结果似乎总是解决指令和控制器之间发生的问题。

我在指令中有问题。我认为我没有正确理解范围。

我有一个如下所示的指令:

mb.directive("plainText", function() {
    return {
        restrict: 'E',
        scope: {
            value: "@",
        },
        templateUrl: 'plainText.html',
        link: function(scope, element, attrs){

            scope.view = false;

            element.bind("click", function() {

                if ( scope.view == false ) {
                    scope.view = true;
                    console.log(scope.view);
                } else {
                    scope.view = false;
                    console.log(scope.view);
                }
            })

            scope.value = attrs.value;
        }
    }
})

还有一个这样的 HTML 模板:

<div>{{value}}</div> // this part of the directive always stays visible

<div ng-show="{{view}}"> // THIS LINE NEEDS TO RESPOND TO THE CLICK
    <input type="text" ng-model="value">
    <br/>
    <div class="btn btn-default" ng-click="save()">Save</div>
    <div class="btn btn-default" ng-click="cancel()">Cancel</div>
</div>

我的控制台日志显示单击事件被范围值触发,但“视图”并未应用于需要显示和隐藏的 div。

谁能解释我做错了什么?

【问题讨论】:

    标签: javascript jquery angularjs


    【解决方案1】:

    模板应该只是

    <div ng-show="view">
        <input type="text" ng-model="value">
        <br/>
        <div class="btn btn-default" ng-click="save()">Save</div>
        <div class="btn btn-default" ng-click="cancel()">Cancel</div>
    </div>
    

    ng-show 指令监视通过属性传递的作用域变量的变化,因此您需要通过插值传递作用域变量名称而不是变量。

    您还需要在 jQuery 点击处理程序中调用 scope.$apply()

            element.bind("click", function () {
                scope.view = !scope.view;
                console.log(scope.view);
    
                if (!scope.$$phase && !scope.$root.$$phase) {
                    scope.$apply()
                }
            })
    

    演示:Fiddle

    【讨论】:

    • 第一行
      {{value}}
      我需要始终可见,当我点击指令的可见部分时,指令的其余部分需要隐藏或显示.. 当我使用 view 代替 {{view}} 时,仍然没有任何反应。
    • @ng-jslearningcurve 你也可以在没有点击处理程序的情况下做到这一点 - 你可以使用ng-click 指令,如jsfiddle.net/arunpjohny/YnpZS/3
    • 非常感谢。我需要使用点击处理程序,因为其中有更多内容,但我非常感谢这两个示例。您能否再解释一下 $$phase 和 $root.$$phase 。我摆弄了 $scope.$apply 但它处于摆弄的水平..
    • @ng-jslearningcurve 然后尝试像jsfiddle.net/arunpjohny/YnpZS/4这样的点击处理程序
    • @ng-jslearningcurve 当您更改在摘要周期中评估的范围状态时...如果 ngjs 调用了一个方法,那么在方法调用结束时,摘要周期将为由它调用...但在您的情况下,单击处理程序由 jQuery 调用,因此 ng 不知道对范围所做的任何更改,因此您的 ui 将不会根据新范围更改进行更新...当您调用 $apply()它将在内部调用摘要循环,从而更新 ui
    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多