AngularJS 中的scope($scope)

A.单/双向绑定

单向绑定:ng-bing=”nickname”,双向绑定:ng-model=”nickname”

B.指令继承控制器的作用域

index.html

<!DOCTYPE html>
<html ng-app="labApp">
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="js/lib/angular.js"></script>
        <script src="js/app.js"></script>
    </head>
    <body>
        <div ng-controller="defaultCtrl">
            <p id="one" lab-input></p>
            <p id="two" lab-input></p>
        </div>
    </body>
</html>

app.js

angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
    })
    .directive(‘labInput‘,function(){
        return {
            template:‘<p><input type="text" ng-model="nickname" /></p>‘
        };
    });

总结:

1.指令从控制器中继承了控制器中定义的变量:nickname

2.两个指令中的nickname都是同步的

C.指令使用自已/实例的作用域

app.js

 angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
    })
    .directive(‘labInput‘,function(){
        return {
            //新增的
            controller:function($scope){
                $scope.nickname="pktmandy";
            },
            template:‘<p><input type="text" ng-model="nickname" /></p>‘
        };
    });

总结:

1.不再使用控制器(defaultCtrl)中的变量:nickname,而是使用指令控制器中声明的:nickname

app.js

angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
    })
    .directive(‘labInput‘,function(){
        return {
            //新增的
            scope:true,
            controller:function($scope){
                $scope.nickname="pktmandy";
            },
            template:‘<p><input type="text" ng-model="nickname" /></p>‘
        };
    });

总结:

1.两个指令都有各自的实例:nickname

D.指令中的隔离作用域

app.js

angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
    })
    .directive(‘labInput‘,function(){
        return {
            scope:{},
            template:‘<p><input type="text" ng-model="nickname" /></p>‘,
            link:function(scope,element,attrs){
                scope.$watch(‘nickname‘,function(v){
                    console.log(‘current nickname:‘+v);
                });
            }
        };
    });

输入顺序:

1.选中部分的上部分为:第一个input输入

2.选中部分的为:第二个input输入

3.选中部分的下部分为:在2后接着在第一个input中输入的

E.连接指令隔离作用域和控制器(defaultCtrl)中的作用域

E.1: 从defaultCtrl中到labInput的单向绑定:@

index.html

<!DOCTYPE html>
<html ng-app="labApp">
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="js/lib/angular.js"></script>
        <script src="js/app.js"></script>
    </head>
    <body>
        <div ng-controller="defaultCtrl">
            <p id="one" lab-input nickname="{{nickname}}"></p>
            <p id="two" lab-input></p>
        </div>
    </body>
</html>

app.js

angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
        $scope.$watch(‘nickname‘,function(v){
            console.log(‘controller current nickname:‘+v);
        });
    })
    .directive(‘labInput‘,function(){
        return {
            scope:{
                nickname:‘@‘
            },
            template:‘<p><input type="text" ng-model="nickname" /></p>‘,
            link:function(scope,element,attrs){
                scope.$watch(‘nickname‘,function(v){
                    console.log(‘directive current nickname:‘+v);
                });
            }
        };
    });

E.2:从defaultCtrl中到labInput的之间的双向绑定:=

改动的地方(app.js)1:

把E.1中的@替换为=

改动的地方(index.html)2:

        <div ng-controller="defaultCtrl">
            <p id="one" lab-input nickname="nickname"></p>
            <p id="two" lab-input></p>
        </div>

如果还是使用{{}}会报以下错误:

总结:

此时如果在input中改变值可以看到控制器和指令的watch都有输出

E.3 从指令(labInput)中调用控制器(defaultCtrl)中的行为:&

index.html

<!DOCTYPE html>
<html ng-app="labApp">
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="js/lib/angular.js"></script>
        <script src="js/app.js"></script>
    </head>
    <body>
        <div ng-controller="defaultCtrl">
            <p id="one" lab-input nickname="nickname" re-action="reverse()"></p>
            <p id="two" lab-input></p>
        </div>
    </body>
</html>

app.js

angular
    .module("labApp",[])
    .controller(‘defaultCtrl‘,function($scope){
        $scope.nickname="xiaofanku";
        $scope.reverse=function(){
            $scope.nickname=$scope.nickname.split("").reverse().join("");
        };
        $scope.$watch(‘nickname‘,function(v){
            console.log(‘controller current nickname:‘+v);
        });
    })
    .directive(‘labInput‘,function(){
        return {
            scope:{
                nickname:‘=‘,
                reAction:‘&‘
            },
            template:‘<p><input type="text" ng-model="nickname" ng-click="reAction()" /></p>‘,
            link:function(scope,element,attrs){
                scope.$watch(‘nickname‘,function(v){
                    console.log(‘directive current nickname:‘+v);
                });
            }
        };
    });

总结:

载入成功后,点击输入框会显示如下

时间: 2024-08-18 11:37:09

AngularJS 中的scope($scope)的相关文章

angularjs中directive声明scope对象时修饰符解释和用法

在angular中我们定义directive方法时,可以看到 return { restrict: 'AE', scope: {}, template: '<div></div>', link: function() {} } 除了代码中出现的属性,还有一些其他的属性可供配置,这里不作详述. 今天我们要说的重点是scope字段. 常规用法设置 scope: { name: '=', age: '=', sex: '@', say: '&' } 假设我们的hml代码如下 &l

外部javascript 方法修改 angularjs 中$rootScope和$scope

修改 $rootScope var $body = angular.element(document.body);   // 1 var $rootScope = $body.scope().$root;         // 2 $rootScope.$apply(function () {               // 3     $rootScope.notesconfigs.outpath = path; }); 2. 修改 $scope var appElement = docum

通过几段代码,理清angularJS中的$injector、$rootScope和$scope的概念和关联关系

$injector.$rootScope和$scope是angularJS框架中比较重要的东西,理清它们之间的关系,对我们后续学习和理解angularJS框架都非常有用. 1.$injector其实是一个IOC容器,包含了很多服务(类似于spring框架中的bean),其它代码能够通过       $injector.get("serviceName")的方式,从injector中获取所需要的服务.详情参考这篇文章 2.scope是angularJS中的作用域(其实就是存储数据的地方)

AngularJS中Scope间通讯Demo

在AngularJS中,每一个controller都有对应的Scope,而Scope间有时候需要通讯.比如有如下的一个controller嵌套: <body ng-controller="AppCtrl"> <table ng-controller = "ProductCtrl"> ... <tr ng-repeat="product in products"> <td>{{$index + 1}}

angularjs 中的scope继承关系——(2)

转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include 假设在我们的 controller 中, $scope.myPrimitive = 50; $scope.myObject = {aNumber: 11}; HTML 为: <script type="text/ng-template" id="/tpl1.html&quo

AngularJS中监视Scope变量以及外部调用Scope方法

在AngularJS中,有时候需要监视Scope中的某个变量,因为变量的改变会影响一些界面元素的显示.有时,也希望通过jQuery调用Scope的某个方法. 比如以下场景: <div> <button id="jQBtn">jQ Button</button> </div> <div id="ngSection" ng-controller="NGCtrl"> <input typ

maven中依懒scope说明

compile (编译范围) compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的classpath 中可用,同时它们也会被打包. provided (已提供范围) provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用.例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API:这个Servl

Angularjs中this的指向

在Angularjs中this的指当前的scope. <a class=" ng-click="remove(this)"></a> <!--this指的是a标签作用域下的scope--> <script> app.controller('myCtrl',function($scope){ $scope.remove = function (scope) { scope.remove(); }; }); </script&

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

AngularJs中的directives(指令)

一.指令的职责   指令的职责是修改DOM结构,并将作用域和DOM连接起来.即指令既要操作DOM,将作用域内的数据绑定到DOM节点上,又要为DOM绑定事件调用作用域内的对应的方法. 二.创建自定义指令 调用自定义指令的4种方式:元素.属性.样式类.注释. 常用的是前两种,实例如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title>