angular js 指令的数据传递 及作用域数据绑定

<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>‘
    };
});

  作用域数据绑定  

  自定义标签或者进行扩展时,会有这样的需求场景,要在标签中添加一些属性,实现一些复杂功能。

  关于这些属性,独立作用域是如何的做的呢?看看下面的内容吧。

  举个例子:

<xingoo say="name"></xingoo>
<xingoo say="name()"></xingoo>

  假设传入的是上面这种,我们如何区分它传入的到底是变量呢?还是字符串呢?还是方法呢?

  因此AngularJS有了三种自定义的作用域绑定方式:

  1 基于字符串的绑定:使用@操作符,双引号内的内容当做字符串进行绑定。

  2 基于变量的绑定:使用=操作符,绑定的内容是个变量。

  3 基于方法的绑定:使用&操作符,绑定的内容时个方法。

回到顶部

  首先看一下基于字符串的绑定:

<!doctype html>
<html ng-app="myApp">
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>

        <div ng-controller="myAppCtrl">
            <xingoo say="test string"></xingoo>
            <xingoo say="{{str2}}"></xingoo>
            <xingoo say="test()"></xingoo>
        </div>

        <script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);

            myAppModule.controller("myAppCtrl",[‘$scope‘,function($scope){
                $scope.str1 = "hello";
                $scope.str2 = "world";
                $scope.str3 = "angular";
            }]);

            myAppModule.directive("xingoo",function(){
                return {
                    restrict:‘AE‘,
                    scope:{
                        say:‘@‘
                    },
                    template:"<div>{{say}}</div><br>",
                    repalce:true
                }
            })
        </script>
    </body>
</html>

  看一下代码,在body中使用了三次自定义的标签,每种标签的内部有一个say的属性,这个属性绑定了一个双引号的字符串。

  在指令的定义中,添加了scope:{say:‘@‘}这个键值对属性,也就是说,angular会识别say所绑定的东西是一个字符串。

  在模板中,使用表达式{{say}}输出say所表示的内容。

  可以看到,双引号内的内容都被当做了字符串。当然{{str2}}表达式会被解析成对应的内容,再当做字符串。

回到顶部

  如果绑定的是一个变量呢!

<!doctype html>
<html ng-app="myApp">
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>

        <div ng-controller="myAppCtrl">
            ctrl:<input type="text" ng-model="testname"><br>
            directive:<xingoo name="testname"></xingoo>
        </div>

        <script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);

            myAppModule.controller("myAppCtrl",[‘$scope‘,function($scope){
                $scope.testname="my name is xingoo";
            }]);

            myAppModule.directive("xingoo",function(){
                return {
                    restrict:‘AE‘,
                    scope:{
                        name:‘=‘
                    },
                    template:‘<input type="text" ng-model="name">‘,
                    repalce:true
                }
            })
        </script>
    </body>
</html>

  在上面的代码中,可以看到

  1 在控制器myAppCtrl对应的div中,定义了一个变量ng-model —— testname。

  2 testname对应的是输入框中输入的值。

  3 然后把这个变量当做一个参数传递给xingoo这个标签的name属性。

  4 在xingoo标签中,又把这个name绑定到模板中的一个输入框内。

  最终两个输入框的内容被连接起来,无论改变哪一个输入框内的值,testname与name都会发生改变。

  通过下面这张图可以看出来:

  在指令中通过scope指定say绑定规则是变量的绑定方式。

  最终通过xingoo标签内的属性依赖关系把 testname与name连接在一起:

  

回到顶部

  最后是基于方法的绑定:&操作符

  上面展示了基于字符串和变量的绑定方法,下面看看基于方法的绑定:

<!doctype html>
<html ng-app="myApp">
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>

        <div ng-controller="myAppCtrl">
            <xingoo say="sayHello(name)"></xingoo>
            <xingoo say="sayNo(name)"></xingoo>
            <xingoo say="sayYes(name)"></xingoo>
        </div>

        <script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);

            myAppModule.controller("myAppCtrl",[‘$scope‘,function($scope){
                $scope.sayHello = function(name){
                    console.log("hello !"+ name);
                };
                $scope.sayNo = function(name){
                    console.log("no !"+ name);
                };
                $scope.sayYes = function(name){
                    console.log("yes !"+ name);
                };
            }]);

            myAppModule.directive("xingoo",function(){
                return {
                    restrict:‘AE‘,
                    scope:{
                        say:‘&‘
                    },
                    template:‘<input type="text" ng-model="username"/><br>‘+
                        ‘<button ng-click="say({name:username})">click</button><br>‘,
                    repalce:true
                }
            })
        </script>
    </body>
</html>

  这段代码中scope中的绑定规则变成了&,也就是方法绑定。

  在body中,通过自定义标签传入了三个方法,分别是sayHello(name),sayNo(name),sayYes(name),这三个方法都需要一个name变量。

  在指令的定义中,模板替换成一个输入框,一个按钮:

  输入框:用于输入username,也就是三个方法需要的参数name。

  按钮:点击触发函数——通过绑定规则,绑定到相应的方法。

  

  也就是说

  通过say在scope中的定义,angular知道了say对应的是个方法;

  通过{name:username}的关联,知道了传入的是username。

  从而交给对应的方法执行。

  

  页面效果:

回到顶部

  参考

  [1] 大漠穷求,AngularJS实战:http://www.imooc.com/video/3085/0

时间: 2024-10-05 22:27:58

angular js 指令的数据传递 及作用域数据绑定的相关文章

angular view之间的数据传递

之前写过一篇backbone view之间的传递,由于现在在用angular搞开发,现在也来总结一下.在angular 传递数据通俗的讲叫做 广播 ,在一些文章中,也叫做事件的发布与订阅,在angular中通过 发布与订阅制定了数据的传递,使用时,在出发点广播事件,这个事件后面的参数是传递的数据,在适当的位置去进行接收,具体到开发中,对应着$scope和$rootScope的$emit.$broadcast和$on方法.首先了解一下概念: 1.$scope与$scope之间的关系,$scope与

Angular JS (指令 directive)

一,指令的创建 /*--Js code--*/var app = angular.module("superhero",[]);app.directive("superman",function(){return { restrict: "E", template: "<div> Here I am to save the day </div>"}}) /*--HTML code--*/<div

angular js 指令

AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. ng-app 指令初始化一个 AngularJS 应用程序. ng-init 指令初始化应用程序数据. ng-model 指令把元素值(比如输入域的值)绑定到应用程序. 实例   ({{ firstName }} 是通过 ng-model="firstName" 进行同步.) <div ng-app="" ng-init="firstName='John'"> &l

springmvc和js前端的数据传递和接收方式

在springmvc中controller的结果集可通过json格式传到js前端接受,也可以通过Map传给前端,具体实现如下 1,通过json格式传递 controller层实现如下 [java] view plain copy @RequestMapping("queryCityInfo") @ResponseBody public String queryCityInfo()throws Exception{ String provinceId = getString("

Angular JS如何将数据发送至后台 java 类

AngularJS与后端联系实质上就是javascript与后端的联系,传送的就是json对象,只是AngularJS的双向数据绑定非常实用,它可以帮助我们少写很多javascript代码,它的强大之处不用再多介绍.. 首先导入项目所需jar包,这里有DWR的jar包和JSON的jar包: 这里还需要配置DWR框架,省略.... jsp页面代码: <%@ page language="java" import="java.util.*" pageEncodin

angular.js的post数据方式

公司的项目前端部分现在改用angular,一切从头学起,今天记录一下关于数据请求的问题,由于get的请求方式比较简单,与post也类似,所以就单独讲讲post方式. 文档上post数据的写法有好几种,都是利用$http模块,通用写法如下: // Simple GET request example: $http({ method: 'GET', url: '/someUrl' }).then(function successCallback(response) { // this callbac

angular js 页面添加数据保存数据库

一.编写实体类Controller层返回数据使用 package entity; import java.io.Serializable; public class Result implements Serializable{ private static final long serialVersionUID = -8946453797496982517L; private boolean success; private String message; public Result(bool

Angular.js指令

ng-style   <input type="button" value="set color" ng-click="myStyle={color:'red'}"> <input type="button" value="set background" ng-click="myStyle={'background-color':'blue', color: 'black'}&q

angular js及时获取数据值

var directiveData = app.directive("directiveP2", function () { return { link:function postLink(scope,lEle,lAttr) { lAttr.$observe('attrDd', function(value) { YTpageData.bodyAttr.bgMusic = value; console.log(YTpageData) }); } }; });