Javascript 具有自定义指令范围的双向数据绑定
我是AngularJS的新手,在学习AngularJS的过程中,我发现了一篇关于如何在HTML标记中嵌套和继承作用域的精彩文章: 我也通过这篇文章来理解上面的帖子是怎么说的 我创建此文件是为了理解上述概念 HTML: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-
<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
对象具有新更改的值,但由于摘要循环未运行,该值未反映在视图中。如果隔离作用域,则不会在控制器作用域之外(即控制器作用域内)反映任何内容(因为指令现在具有隔离的作用域)。