AngularJS在自定义指令中传递Model

本文是对AngularJS权威指南8.2节的理解,书中的解释比较混乱,花了一些时间才理解作者表达的意思。

假如我们创建了一个指令,用于生成一个包含input和a标签。如果我们想input标签的内容通过ng-model的方式传递出去(例如传递到指令外的另一个input),我们可能会这么写:

<!doctype html>
<html ng-app="myApp">
<head>
    <script src="angular.js"></script>
</head>
<body>
<input type="text" ng-model="myUrl"/>
<div my-directive
     some-attr="{{myUrl}}"
     my-link-text="Click me to go to Google"></div>
<script>
    angular.module(‘myApp‘, [])
            .directive(‘myDirective‘, function() {
                return {
                    restrict: ‘A‘,
                    replace: true,
                    scope: {
                        myUrl: ‘@someAttr‘,
                        myLinkText: ‘@‘
                    },
                    template: ‘          <div>            <input type="text" ng-model="myUrl" />            <a href="{{myUrl}}">{{myLinkText}}</a>          </div>        ‘
                }
            })
</script>
</body>
</html>

生成的HTML如下图所示:

但是这不能达到我们的预期:数据只能从第一个input传递到第二个input,而不能从第二个input传递到第一个input。

原因是指令内部有独立的作用域,指令内的{{myUrl}}不能直接被外部共享。

将代码做如下修改,可以实现被外部共享,注意修改的部分有注释:

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8"/>
    <script src="angular.js"></script>
</head>
<body>
<input type="text" ng-model="myUrl"/>
<!--*****************************************-->
<!--{{myUrl}}改为了myUrl-->
<div my-directive
     some-attr="myUrl"
     my-link-text="Click me to go to Google"></div>
<!--*****************************************-->
<script>
    angular.module(‘myApp‘, [])
            .directive(‘myDirective‘, function() {
                return {
                    restrict: ‘A‘,
                    replace: true,
                    scope: {
                        //*****************************************
                        myUrl: ‘=someAttr‘,//@修改为了=
                        //*****************************************
                        myLinkText: ‘@‘
                    },
                    template: ‘          <div>            <input type="text" ng-model="myUrl" />            <a href="{{myUrl}}">{{myLinkText}}</a>          </div>        ‘
                }
            })
</script>
</body>
</html>

总结

指令内部model共享到外部,只需要将”@”改为”=”,并且将对应的指令的{{}}删掉即可。

时间: 2024-10-12 15:21:39

AngularJS在自定义指令中传递Model的相关文章

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架. 目前有很多JavaScript 产品提供插件给Web开发人员.例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包.但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery

走进AngularJs(四)自定义指令----(中)

上一篇简单介绍了自定义一个指令的几个简单参数,restrict.template.templateUrl.replace.transclude,这几个理解起来相对容易很多,因为它们只涉及到了表现,而没有涉及行为.这一篇将继续学习ng自定义指令的几个重量级参数,了解了它们之后我们的custom directive将不光能"看",还要能"动".开始~ 理解compile和link 不知大家有没有这样的感觉,自己定义指令的时候跟写jQuery插件有几分相似之处,都是先预先

走进AngularJs(五)自定义指令----(下)

自定义指令学习有段时间了,学了些纸上谈兵的东西,还没有真正的写个指令出来呢...所以,随着学习的接近尾声,本篇除了介绍剩余的几个参数外,还将动手结合使用各参数,写个真正能用的指令出来玩玩. 我们在自定义指令(上)中,写了一个简单的<say-hello></say-hello>,能够跟美女打招呼.但是看看人家ng内置的指令,都是这么用的:ng-model="m",ng-repeat="a in array",不单单是作为属性,还可以赋值给它,与

AngularJS笔记--自定义指令

在前端开发中, 我们会遇到很多地方都会用到同一种类型的控件.AngularJS提供了自定义指令功能,我们可以在指令里面定义特定的html模板.提供给前台html调用. 一. 指令的简单定义.  下面定义了一个简单的控件,点击后调转到博客园. Note: 1.命名方式:directive必须以小写字母开头,其中如果后面由大写字母,html调用的时候就要用 - 将单词分开. <html> <script src='angular.js'></script> <scri

Angularjs[25] - 自定义指令(1)(restrict, template, replace)

自定义指令: module.directive(name,directiveFactory) @see $compileProvider.directive() ??  不要使用 ng 为指令,若指令名为 xxx-yyy,在设置指令名时应为 xxxYyy 即驼峰命名法. restrict: 可以任意组合四种风格,如果忽略 restrict,默认为A. 字母 风格 示例 E 元素 <my-dir></my-dir> C 样式类 <span class="my-dir:

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

给指令添加属性,这个属性会成为指令内部作用域的属性 有好几种途径可以设置指令内部作用域中属性的值.最简单的方法就是使用由所属控制器提供的已经存在的作用域. 但是会导致很多其他问题.如果控制器被移除,或者在控制器的作用域中也定义了一个叫 相同的属性名,我们就被迫要修改代码 AngularJS 允许通过创建新的子作用域或者隔离作用域来解决这个常见问题 <div my-directive some-property="someProperty with @ binding">&l

angularJS 使用自定义指令输出模板

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script> </head> <body ng-app="myApp" ng-init=

Angularjs[26] - 自定义指令(2)(templateUrl)

templateUrl: 加载模板所要使用的 URL. 可以加载当前模板内对应的 text/ng-template script id. 在使用 chrome 浏览器时,"同源策略"会阻止 chorme 从 file:// 中加载模板,并显示一个" Access-Control-Allow-Origin "不允许源为 null,可以把项目放在服务器上加载,或者给 chorme 设置一个标志位,命令为:chorme-allow-file-access-from-fil

Vue.directive 自定义指令

// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } }) 局部 directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } } 页面使用 <input v-focus> 自定义指令中传递的三个参数 el: 指令所绑定的元素,