结果就是,一个张三,一个李四。这个例子中,data是一个对象数组,里面包含了两个对象,所以,我们分别把两个对象传递给了case这个属性,case属性就把这个对象的引用传递给了模板中我们写的{{ case.name }}中的case;而如果你在=后边加上了自己定义的名字,那只要把html里case属性换成那个名字就可以了。
第二个例子:经典的双向输入框
按照Angular的入门案例,创建两个双向绑定的输入框,最简单的实现方式就是:
?
使用ng-model指令就可以做到了。接着,我们在自己的指令中实现这个效果。
JS代码:
directive("direct",function(){
?
?
?
? ? ? ? return{
?
?
?
? ? ? ? ? ? restrict: 'ECMA',
?
?
?
? ? ? ? ? ? template: '
指令中:
',
?
?
?
? ? ? ? ? ? scope:{
?
?
?
? ? ? ? ? ? ? model:'='
?
?
?
? ? ? ? ? ? }
?
?
? ? ? ? }
?
?
? })
?
.controller("nameController",function($scope){
?
?
? ? ? $scope.data=[{name:"张三"},{name:"李四"}];
?
?
});
?
HTML代码:
?
?
? ? ? ? 父级scope中:
?
? ? ? ?
?
?
这就完成了,其实只不过是加了一点小把戏,把ng-model换成了model而已。
注意到,这两个例子中,都是使用对象的引用,而不是单纯的字符串,这也是=可以进行双向绑定的关键。
? ? ? 最后是&符号。它的含义是:对父级作用域进行绑定,并将其中的属性包装成一个函数,注意,是属性,意即,任何类型的属性都会被包装成一个函数,比如一个单纯的字符串,或是一个对象数组,或是一个函数方法,如果是字符串、对象数组和无参的函数,那么可想而知,它们都会被包装成一个无参的函数,若是有参的函数方法则反之,并且我们需要为其传入一个对象。现在,分别针对有参和无参两种情况举例。
无参情况↓
JS代码:
.directive("direct",function(){
?
?
?
?
? ? ? ? return{
?
? ? ? ? ? ? restrict: 'ECMA',
?
? ? ? ? ? ? template: '
{{ title }}
'+'
- {{ x.text }} ? ? ? ? ? ? ? ? ? ? /li>
',
?
? ? ? ? ? ? scope:{
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? getTitle:'&',
? ? ? ? ? ? ? getContent:'&'? ? ? ? ? ?
? ? ? ? },
? ? ? ? ? ? controller:function($scope){
? ? ? ? ? ? ? $scope.title=$scope.getTitle();? ? //调用无参函数?
? ? ? ? ? ? ? $scope.contents=$scope.getContent();? ? //调用无参函数
? ? ? ? ? }
? ? ? }
?})
?
?
.controller("nameController",function($scope){
?
? ? $scope.title="标题";
?
? ? $scope.contents =[{text:1234},{text:5678}];
});
?
?HTML代码:
? ? ?
?
这个例子有几个注意点:
1.指令的本地属性(即模板里花括号中的属性)需要从本地取值,所以使用了controller选项,而在controller选项中,两个无参方法分别返回了父级scope中的title字符串和contents对象数组。
2.在HTML中,我们把设置了get-title和get-content的属性值为title和contents,这实际上就完成了与父级scope的绑定,因为我们才可以从那儿取得实质的内容。
OK,有参情况↓
JS代码:
.directive("direct",function(){
return{
? ? ? ? ? ? restrict: 'ECMA',
? ? ? ? ? ? template: '
'+'
',
? ? ? ? ? ? scope:{
? ? ? ? ? ? ? ? show:'&'? ? ? ? ? ? ?
? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ?
? ? ? ? }
? ? })
?
? ? .controller("nameController",function($scope){
? ? ? ? $scope.showName=function(name){
?
? ? ? ? ? alert(name);
? ? ? ? }
? ? });
?
HTML代码:
?
? ? ?
?
?
这