Angularjs 用$apply理解链接函数
我正在看一个教程,可以看到。我无法理解客户指令Angularjs 用$apply理解链接函数,angularjs,Angularjs,我正在看一个教程,可以看到。我无法理解客户指令上的事件侦听器 应用程序的布局如下所示: index.html <!DOCTYPE html> <html ng-app="myapp"> <head> <meta charset="utf-8" /> <title>AngularJS Plunker</title> <script>document.write('<base hr
上的事件侦听器
应用程序的布局如下所示:
index.html
<!DOCTYPE html>
<html ng-app="myapp">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.2.x" src="http://code.angularjs.org/1.2.7/angular.js" data-semver="1.2.7"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<input type="text" ng-model="color" placeholder="Enter a color"/>
<hello-world/>
</body>
</html>
安古拉斯普朗克
文件。写(“”);
app.js
var app = angular.module('myapp', []);
app.controller('MainCtrl', function($scope) {
});
app.directive('helloWorld',function(){
return{
restrict: 'AE',
replace: true,
template: '<p style="background-color:{{color}}">Hello World</p>',
link: function(scope,elem,attrs){
elem.bind('click',function(){
elem.css('background-color','white');
scope.$apply(function(){
scope.color="white";
});
});
elem.bind('mouseover',function(){
elem.css('cursor','pointer');
});
}
}
});
var-app=angular.module('myapp',[]);
应用程序控制器('MainCtrl',函数($scope){
});
app.directive('helloWorld',function(){
返回{
限制:“AE”,
替换:正确,
模板:“Hello World
”,
链接:功能(范围、要素、属性){
元素绑定('单击',函数(){
元素css('背景色','白色');
作用域$apply(函数(){
scope.color=“白色”;
});
});
元素绑定('mouseover',function(){
元素css('cursor','pointer');
});
}
}
});
我的问题是为什么单击侦听器中的回调包含
$apply
方法?为什么一个人不能只拥有scope.color=“white”
指令helloWorld
当前查看其父作用域(在其他情况下,如果指令中有属性scope:true
,它将有一个隔离作用域,但这里不是这种情况。)
在查看数据父作用域的指令中,没有双向数据绑定。换句话说,该指令最初将从其父作用域接收信息,但不会向父作用域发送更新。这就是为什么我们称之为范围。$apply
。这将手动强制作用域上发生摘要循环,该循环将在其所有观察程序中运行并查找更改
这就是人们在“断章取义”时的意思
为了了解更多关于摘要周期的信息,我将看一看这篇文章,它基本上向您展示了如何在非常高的抽象级别上构建自己的AngularJS版本
此外,如果指令中有scope:true
,从而允许指令有自己的隔离作用域,则不需要作用域。$apply
方法。但是,除非显式授予父作用域访问数据的权限,否则隔离作用域数据将仅对该指令可用,并且没有父作用域(例如,通过手动查找作用域的父级,这是不可取的。对于这种情况,您可能希望查看,这仅与命名空间组件相关。)
编辑
上述操作仍会将元素的背景颜色更改为白色。这与范围
无关
elem.bind('click',function(){
elem.css('background-color','white');
scope.$apply(function(){
scope.color="white";
});
});
上面强制父作用域在文本框中显示颜色“白色”的文本名称(这个:
)
ng model
引用了scope.color
elem.bind
发生在角度上下文之外-$scope.$apply
手动触发摘要循环,以便视图得到更新如果回调包含角度语法,elem.bind怎么会发生在角度上下文之外?我不明白您的意思“回调包含角度语法”…我想说的是,当回调异步进行时,角度不知道它,因此它不会更新响应的bindingshanks。很好的解释。如果您转到plunker并删除$apply
,只需使用scope.color=“white”
应用程序仍按预期工作,即元素的颜色在单击时变回白色。这是否意味着除$apply之外的其他内容正在启动摘要循环?或者范围:false
是指令中的默认值吗?@TheamateUrdata分析师,是的,颜色仍会变回,因为行elem.css('background-color','white');
@theamateurdataanalyst,但是scope.white
不会传播到文本框,该文本框应该显示当前选定的颜色。啊,是的,你是对的,它不会传播到顶部。谢谢@Josh Beam。
elem.bind('click',function(){
elem.css('background-color','white');
scope.$apply(function(){
scope.color="white";
});
});