首页 >> 大全

angularjs中的隔离作用域理解以及绑定策略

2023-09-03 大全 25 作者:考证青年

我们首先看下面的例子:



我们在看看中的代码:

var myModule = angular.module("MyModule", []);
myModule.directive("hello", function() {return {restrict: 'AE',template: '
{{userName}}
',replace: true} });

这时候当运行页面的时候发现只要有一个input中的输入变化了,这时候所有的nput的内容都会变化:

理解功分器的隔离_安装域后没有域策略_

这样就会面临一个问题:我们的指令无法单独使用,于是就有了独立作用域的概念。

var myModule = angular.module("MyModule", []);
myModule.directive("hello", function() {return {restrict: 'AE',scope:{},template: '
{{userName}}
',replace: true} });

通过把scope设置为{},那么每一个指令就具有自己独立的scope空间,于是就不会相互影响了。但是中最重要的概念是: 绑定策略。其具有绑定策略如下:

理解功分器的隔离__安装域后没有域策略

第一步:我们看看原始的方式,也就是不使用上面的三种绑定方式

安装域后没有域策略_理解功分器的隔离_


看看中的内容:

var myModule = angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope', function($scope){$scope.ctrlFlavor="百威";//在控制器中$scope中设置了ctrlFlavor属性
}])
//定义了drink指令
myModule.directive("drink", function() {return {restrict:'AE',template:"
{{flavor}}
" ,link:function(scope,element,attrs){scope.flavor=attrs.flavor;//链接的时候把drink指令上的flavor属性放在scope中,然后在template中显示}} });

这时候的DOM结构如下:

_理解功分器的隔离_安装域后没有域策略

但是,这种方式要通过attrs.来获取这个指令的属性值,然后需要把这个属性值绑定到scope对象上,最后在中才能通过{{}}这种形式获取到scope中的值!

第二步:我们使用上面的@来替换第一种方式,因为它每次都需要自己指定link函数:

var myModule = angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope', function($scope){$scope.ctrlFlavor="百威";//在控制器中$scope中设置了ctrlFlavor属性
}])
//定义了drink指令
myModule.directive("drink", function() {return {restrict:'AE',scope:{flavor:'@'},template:"
{{flavor}}
" } });

这种方式就是把 指令drink中的属性值绑定到scope对象上,而且这是ng为我们自动绑定的。不过,@绑定绑定的是字符串,而不是对象!

第三步:我们来学习一下双向数据绑定


Ctrl:

Directive:

我们再来看看控制器中内容

var myModule = angular.module("MyModule", []);
//指定了控制器对象
myModule.controller('MyCtrl', ['$scope', function($scope){$scope.ctrlFlavor="百威";
}])
//指定了指令
myModule.directive("drink", function() {return {restrict:'AE',scope:{flavor:'='//这里通过'='指定了drink指令的flavor和scope中的双向数据绑定!},template:''}
});

这就是'='这种绑定方式。其实现了双向的数据绑定策略。我们看看最后的DOM结构是怎么样的:

理解功分器的隔离_安装域后没有域策略_

其实双向数据绑定是很明显的,需要好好理解双向数据绑定(指令和控制器之间的双向数据绑定)

第四步:我们使用&绑定策略来完成对父级方法的调用:


其中定义了三个指令, 每一个指令都需要调用中的一个方法,( 中如何实现控制器和指令之间交互 指出了可以通过定义属性的方式使得控制器和指令之间进行交互,不过这里我们可以通过简单的&完成同样的功能)并且传入不同的参数name值:

var myModule = angular.module("MyModule", []);
//为控制器指定了一个sayHello方法,同时为这个方法可以传入一个参数
myModule.controller('MyCtrl', ['$scope', function($scope){$scope.sayHello=function(name){alert("Hello "+name);}
}])
myModule.directive("greeting", function() {return {restrict:'AE',scope:{greet:'&'//传递一个来自父scope的函数用于稍后调用,获取greet参数,得到sayHello(name)函数},//在template中我们在ng-click中指定一个参数,其指定方式为调用controller中greet方法,传入的参数name值为username//也就是ng-model='userName'中指定的参数template:'
'+'
'} });

通过&就可以完成对父级作用方法的调用,而不是采用传统的通过 为指令指定属性的方式完成控制器和指令之间的通行!

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了