Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有自定义指令范围的双向数据绑定_Javascript_Angularjs_Scope_Angularjs Directive - Fatal编程技术网

Javascript 具有自定义指令范围的双向数据绑定

Javascript 具有自定义指令范围的双向数据绑定,javascript,angularjs,scope,angularjs-directive,Javascript,Angularjs,Scope,Angularjs Directive,我是AngularJS的新手,在学习AngularJS的过程中,我发现了一篇关于如何在HTML标记中嵌套和继承作用域的精彩文章: 我也通过这篇文章来理解上面的帖子是怎么说的 我创建此文件是为了理解上述概念 HTML: <body ng-app="myApp"> <h1>Hello AngularJS!</h1> <div ng-controller="myCtrl">{{hello}} <div anchor-

我是AngularJS的新手,在学习AngularJS的过程中,我发现了一篇关于如何在HTML标记中嵌套和继承作用域的精彩文章:

我也通过这篇文章来理解上面的帖子是怎么说的

我创建此文件是为了理解上述概念

HTML:

<body ng-app="myApp">
    <h1>Hello AngularJS!</h1>
    <div ng-controller="myCtrl">{{hello}}
        <div anchor-link> 
            <a href="javascript:;">click me</a>
            <div ng-show="t.show">show me</div>
            <div ng-hide="t.show">hide me</div>
        </div>
    </div>
</body>
var app = angular.module("myApp", []);

app.controller('myCtrl', function ($scope) {
    $scope.hello = 'Hello World!';
    $scope.t = {
        show: true
    };
});

app.directive('anchorLink', function () {
    return {
        restrict: 'EA',
        link: function (scope, elem, attr) {
            elem.on('click', function () {
                 scope.t.show = !scope.t.show;
            });
        }
    };
});
现在我的问题是:

  • 为什么双向数据绑定在我的小提琴上不起作用?自定义指令的作用域不应该从其父级(即控制器)继承吗

  • 如果我使用
    $scope.t
    作为控制器作用域上的对象。那么为什么它不切换“显示我”和“隐藏我”div呢?我还尝试在自定义指令中使用
    scope:true
    ,但仍然不起作用

  • 这是因为我的链接函数中的
    范围
    没有继承原型吗

  • 它真的在改变父作用域的
    $scope.t
    对象吗


  • 因此,您需要做的是:

    http://jsfiddle.net/DkFx9/
    
    这里的情况是,您正在使用jQuery的
    click
    事件处理程序来处理click事件,并更改处理程序中的
    scope
    变量。问题是angular无法知道范围中的某些内容已更改,因此需要更新视图

    通常,当您使用angular的指令(如
    ng click=“t.show=!t.show”
    )执行类似操作时,angular知道某些操作甚至发生在angular中,并运行摘要循环来执行脏检查和更新相关视图

    在您的情况下,我们必须告诉angular正在发生什么,它必须运行摘要循环<代码>范围。$apply
    获取要执行的代码片段,然后要求angular运行摘要循环并更新需要更新的视图


    希望有帮助。

    哦!!好啊但是除了使用$apply还有其他方法吗?那么我的第四个问题呢。即使由于您所解释的原因没有发生数据绑定,但父范围中的值是否实际发生了更改?我想是的,因为警报确实在事件句柄中显示更新的值,所以我可以隔离作用域以便发生绑定吗?或者,它不会因为与您解释的相同的原因而产生影响?因此,请运行我共享的JSFIDLE。你会注意到这些值确实在变化。数值在变化,是的。数据绑定正在发生。唯一的问题是Javascript对象发生了更改,但Angular不知道,因此它无法更新视图并按照
    ng hide
    ng show
    的要求执行DOM操作。因此,基本上,控制器作用域的
    t
    对象具有新更改的值,但由于摘要循环未运行,该值未反映在视图中。如果隔离作用域,则不会在控制器作用域之外(即控制器作用域内)反映任何内容(因为指令现在具有隔离的作用域)。