angular js权威指南笔记三--向指令中传递数据

给指令添加属性,这个属性会成为指令内部作用域的属性

有好几种途径可以设置指令内部作用域中属性的值。最简单的方法就是使用由所属控制器提供的已经存在的作用域。

但是会导致很多其他问题。如果控制器被移除,或者在控制器的作用域中也定义了一个叫 相同的属性名,我们就被迫要修改代码

AngularJS 允许通过创建新的子作用域或者隔离作用域来解决这个常见问题

<div my-directive some-property="someProperty with @ binding"></div>

在作用域对象内部把 someProperty 值设置为 @ 这个绑定策略。

这个绑定策略告诉 AngularJS 将 DOM 中 some-property 属性的值复制给新作用域对象中的 someProperty 属性:

scope: {
someProperty: ‘@‘//相当于someProprty(新作用域的对象)=‘@someProperty(Dom中的someProperty)’
}
注意,默认情况下 someProperty 在 DOM 中的映射是 some-property 属性。如果我们想显式指定绑定的属性名,可以用如下方式:
scope: {
someProperty: ‘@someAttr‘
}
在这个例子中,被绑定的属性名是 some-attr 而不是 some-property 。
<div my-directive
some-attr="someProperty with @ binding">
</div>

实际案例:

<div my-directive
my-url="http://google.com"
my-link-text="Click me to go to Google"></div>
angular.module(‘myApp‘, [])
.directive(‘myDirective‘, function() {
return {
restrict: ‘A‘,
replace: true,
scope: {
myUrl: ‘@‘, // 绑定策略
myLinkText: ‘@‘ // 绑定策略
},
template: ‘<a href="{{myUrl}}">‘ +
‘{{myLinkText}}</a>‘
};
});

创建一个文本输入域,并将输入值同指令内部隔离作用域的属性绑定起来:

angular.module(‘myApp‘, [])
.directive(‘myDirective‘, function() {
return {
restrict: ‘A‘,
replace: true,
scope: {
myUrl: ‘@‘, // 绑定策略
myLinkText: ‘@‘ // 绑定策略
},
template: ‘<a href="{{myUrl}}">‘ +
‘{{myLinkText}}</a>‘
};
});

<input type="text" ng-model="myUrl" />
<div my-directive
some-attr="{{ myUrl }}"
my-link-text="Click me to go to Google">
</div>

以上代码可以正常运行

但如果我们将文本输入字段移到指令 内部并在另一个指令中进行绑定,就无法正常工作了:

<div my-directivesome-attr="{{ myUrl }}"
my-link-text="Click me to go to Google">
</div>

template: ‘<div>\
<input type="text" ng-model="myUrl" />\
<a href="{{myUrl}}">{{myLinkText}}</a>\
</div>‘

内置指令 ng-model 在它自身内部的隔离作用域和 DOM 的作用域(由控制器提供)之间创建了一个双向数据绑定。

<label>Their URL field:</label>
<input type="text"ng-model="theirUrl">
<div my-directive
some-attr="theirUrl"
my-link-text="Click me to go to Google"></div>

angular.module(‘myApp‘, [])
.directive(‘myDirective‘, function() {
return {
restrict: ‘A‘,
replace: true,
scope: {
myUrl: ‘=someAttr‘, // 经过了修改
myLinkText: ‘@‘
},
template: ‘\
<div>\
<label>My Url Field:</label>\
<input type="text"\
ng-model="myUrl" />\
<a href="{{myUrl}}">{{myLinkText}}</a>\
</div>\
};
});

时间: 2024-12-18 02:47:33

angular js权威指南笔记三--向指令中传递数据的相关文章

angular js权威指南笔记

ng-app 属性声明所有被其包含的内容都属于这个 AngularJS 应用 只有被具有 ng-app 属性的 DOM 元素包含的元素才会受 AngularJS 影响 视图理解为模型状态的映射.当客户端的数据模型发生变化时,视图就能反映出这些变化 MVC 是一种软件架构设计模式,它将表现从用户交互中分离出来.通常来讲,模型中包含应用的数据和与数据进行交互的方法, 视图将数据呈献给用户,而 控制器则是二者之间的桥梁 当 AngularJS 认为某个值可能发生变化时,它会运行自己的事件循环来检查这个

Node.js权威指南笔记

第一章 Node.js介绍 1.Node.js中的模块 每个模块一个js文件,每个模块定义的全局变量或函数的作用范围也被限定在这个模块之内,只有使用exports对象才能将其传递到外部 2.简单实例: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<head><meta cha

JS权威指南笔记1

1.JavaScript数据类型可分为两种:原始类型和对象类型.原始类型下又包括数字.字符串和布尔值,以及null和undefined这两个特殊的:对象是属性的集合,且每个属性都有自己的"名/值对",常见的对象类型有函数.数组(Array).日期(Date).正则(RegExp)和错误(Error). 1.1 数据类型也可分为可变类型和不可变类型.对象和数组都是可变类型,数字.布尔值,以及null和undefined都是不可变类型. 2.JavaScript解释器有自己的内存管理机制,

JS权威指南笔记(171页)-this关键字的作用域

和变量不同,关键字this没有作用域的限制,嵌套函数不会从调用它的函数中继承this.如果嵌套函数作为方法调用,其this值不是全局对象(非严格模式下),就是undefined(严格模式下).很多人误以为调用嵌套函数时this会指向调用外层函数的上下文.如果你想访问这个外部函数的this值,需要将this的值保持在一个变量里,这个变量和内部函数都同在一个作用域内.通常使用变量self来保存this,比如: var o={ m:function(){ var self=this; console.

Node.js权威指南 (5) - 使用Buffer类处理二进制数据

5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / 74 5.3.2 Buffer对象的write方法 / 75 5.3.3 StringDecoder对象 / 755.4 Buffer对象与数值对象之间的相互转换 / 775.5 Buffer对象与JSON对象之间的相互转换 / 795.6 复制缓存数据 / 805.7 Buffer类的类方法 /

【vue.js权威指南】读书笔记(第一章)

最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.js不是一个框架-它只聚焦视图层,是一个用来构建数据驱动的Web界面的库.Vue.js通过简单的API来提供高校的数据绑定和灵活的组件系统 vue.js的特性 轻量级:体积非常小,而且不依赖其他基础库 数据绑定:对于一些富交互,状态机类似的前端UI界面,数据绑定非常简单,方便 指令:类似与AJ,可以使用v-*的

angular学习笔记(三十)-指令(5)-link

这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数:scope,iEle,iAttrs,ctrl,linker scope:指令所在的作用域,这个scope和指令定义的scope是一致的.至于指令的scope,会在讲解scope属性的时候详细解释 iEle:指令元素的jqLite封装.(也就是说iEle可以调用angular封装的简版jq的方法和属

angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指令(5)-link文章也提到了link函数的第五个参数linker. 这篇文章就来讲解一下transclude()方法(linker()方法),是怎么使用的,另外,它也是compile函数的第三个参数,用法一样. 下面就通过自己写一个简易的模拟ngRepeat的指令cbRepeat,来了解linke

angular学习笔记(三十)-指令(7)-compile和link(2)

继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的代码: html: <body> <div ng-controller="compileCtrl"> <level-one> <level-two> <level-three> hello,{{name}} </level-