AngularJs(五)从Controller控制器谈谈$scope作用域

大纲

  • 用于简单示例和简单应用的controller 应用

  • 多个controller应用的作用域问题

  • controller继承作用域问题

Controller的创建

AngularJs controller使用无处不在,在里代码演示比较简单的创建工作。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="exampleApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>App</title>
    <script src="angular.js"></script>
    <link href="bootstrap-theme.css" rel="stylesheet" />
    <link href="bootstrap.css" rel="stylesheet" />
    <script>
        angular.module("exampleApp", [])
            .controller("defaultCtrl", function ($scope) {
                $scope.setInput = function (value) {
                    console.log("print:" + value);
                }
            });
    </script>
</head>
<body ng-controller="defaultCtrl">
     <div class="well">
         <h3>Count</h3>
         <div class="form-group">
             <input class="form-control" required ng-model="value" />
             <button ng-click="setInput(value)">Click</button>
         </div>
     </div>
</body>
</html>

  在这控制很简单,首先我在html 中添加了 ng-app 属性,表示module的作用范围。

在 body 中添加了 ng-controller  表示 defaultCtrl 控制器的作用范围。

input 便签中ng-model 指令的是绑定数据,双向数据绑定(MVVM)。

$scope 是AngularJs内置的作用域。

此实例的只是把输入的值打印到控制台中,如图:

仅此而已,简单吧。

多个控制器controller作用域问题

现在我们来改造下程序,

<body >
    <div class="well" ng-controller="defaultCtrl">
        <h3>Count</h3>
        <div class="form-group">
            <input class="form-control" required ng-model="value" />
            <button ng-click="setInput(value)">Click</button>
        </div>
    </div>
    <div class="well" ng-controller="defaultCtrl">
        <h3>Count</h3>
        <div class="form-group">
            <input class="form-control" required ng-model="value" />
            <button ng-click="setInput(value)">Click</button>
        </div>
    </div>
</body>

  其余代码不变,我只是把放到body 中的属性 ng-controller 放到了两个div中。我重用了defaultCtrl控制器,猜想下,如果我在第一个input标签输入内容,我点击第二个控制器的button按钮,会出现你所期望的结果吗?

结果是否和你想你的一样呢,大家可以看到这个结果为undefined. 在个很好解释,应为他们的作用域不同,虽然你重复使用了统一控制器,但是在创建作用域确实不同的。

调用的工厂函数会返回不同的作用域。

那么如何进行不同作用域之间的访问呢,在Angularjs中对于作用域访问有个$rootScope 。

在这里有三个函数需要介绍下,

$on(name,handler)  注册一个事件处理函数,该函数在特定的事件被当前作用域收到时将被调用

$emit(name,args)   向当前父作用域发送一个事件,直至根作用域。

   $broadcast(name,args) 向当前作用域下的子作用域发送一个事件,参数是事件名称以及一个用于作用向事件提供额外数据的对象。

   现在来更改下代码:

   

<script>
        angular.module("exampleApp", [])
            .controller("defaultCtrl", function ($scope,$rootScope) {
                $scope.$on("UpdateValue", function (event, args) {
                    $scope.input = args.zip;
                });
                $scope.setInput = function (value) {
                    $rootScope.$broadcast("UpdateValue", { zip: value });
                    console.log("print:" + $scope.input);
                }
                $scope.copy = function () {
                    console.log("copy:" + $scope.input);
                };
            });
    </script>

  

 <div class="well" ng-controller="defaultCtrl">
        <h3>Count</h3>
        <div class="form-group">
            <input class="form-control" required ng-model="value" />
            <button ng-click="copy()">Copy</button>
        </div>
    </div>

  在段代码中我添加了几个函数,同时改变了第二个控制器的函数。

结果:

确实发生了。

controller继承

<script>
        angular.module("exampleApp", [])
            .controller("defaultCtrl", function ($scope, $rootScope) {
                //$scope.$on("UpdateValue", function (event, args) {
                //    $scope.input = args.zip;
                //});
                $scope.setInput = function (value) {
                    //$rootScope.$broadcast("UpdateValue", { zip: value });
                    $scope.input = value;
                    console.log("print:" + $scope.input);
                }
                $scope.copy = function () {

                    console.log("copy:" + $scope.input);
                };
            })
        .controller("simpleCtrl", function ($scope) {
            $scope.copy = function () {
                console.log("copy:" + $scope.input);
            };
        });
    </script>

  

<body ng-controller="defaultCtrl">
    <div class="well">
        <h3>Count</h3>
        <div class="form-group">
            <input class="form-control" required ng-model="value" />
            <button ng-click="setInput(value)">Click</button>
        </div>
    </div>
    <div class="well" ng-controller="simpleCtrl">
        <h3>Count</h3>
        <div class="form-group">
            <input class="form-control" required ng-model="value" />
            <button ng-click="copy()">Copy</button>
        </div>
    </div>
</body>

  我添加了一个控制器,simpleCtrl  仔细观察下,发现defaultCtrl 包含了simpleCtrl 中,所以作用simple 也继承 了。

结果图:发下我在第一个窗中输入时,第二个也变了,应为都是同一个value。

$scope 作用域问题,在使用controller时 要明白其作用域。

时间: 2024-10-13 21:56:29

AngularJs(五)从Controller控制器谈谈$scope作用域的相关文章

(十五)在controller之外修改$scope中的数据,双向绑定特性失效,不能自动刷新

在angularjs中通过angular.element(dom).scope()可以拿到某个dom元素关联的作用域,从而可以访问$scope中的属性和方法.但是在ng-controller函数之外修改$scope中的数据,angular的$scope是不会自动刷新的,即双向绑定特性失效. <html> <head> <script src="angular-1.3.15.js"></script> <script> var

angularjs的ng-repeat指令下的scope作用域

ng-repeat指令在迭代的时候,每次迭代都会创建一个新的scope,比如下面的代码: <div ng-repeat="list in lists" ng-controller="listController"> <some-directive/> </div> app.controller('listController',function($scope){ $scope.lists = [1,2,3,4,5] }) div所

排球记分员计分程序(五)————Controller控制器与Action方法的设计

一.创建跟Duiwu实体模型类相关的Controller管理器    在资源方案解决管理器中鼠标右键单击Controller文件夹,并创建一个新的 DuiWuController控制器. 单击添加. Visual Studio Express 会创建以下文件和文件夹: · 项目控制器文件夹中的DuiWuController.cs文件. · 项目视图文件夹下的 DuiWu文件夹. · 在新的Views\DuiWu文件夹中创建Create.cshtml. Delete.cshtml. Details

AngularJS Scope(作用域)

1. AngularJS Scope(作用域) Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Scope 可应用在视图和控制器上. 2. 使用Scope:在 AngularJS 创建控制器时,你可以将 $Scope 对象当作一个参数传递 <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

Angularjs MVC 以及 $scope 作用域 Angularjs 模块 的 run 方法 以及依赖注入中代码压缩问题

Angularjs MVC 以及 $scope 作用域 Angularjs 模块的 run 方法 以及依赖注入中代码压缩问题 1. Angularjs MVCModel:数据模型层View:视图层,负责展示Controller:业务逻辑和控制逻辑优点: 代码模块化 代码逻辑比较清晰.可移值性高,后期维护方便.代码复用,代码规模越来越大的时候,切分职责是大势所趋缺点:运行效率稍微低一些2. Angularjs $scope 作用域1. $scope 多控制器单独作用域<!DOCTYPE html>

一招制敌 - 玩转 AngularJS 指令的 Scope (作用域),讲得特别好

学习了AngularJS挺长时间,最近再次回首看看指令这部分的时候,觉得比自己刚开始学习的时候理解的更加深入了,尤其是指令的作用域这部分. 步入正题: 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的作用域或者根作用域($rootScope)),还是创建一个新的自己的作用域,当然AngularJS为我们指令的scope参数提供了三种选择,分别是:false,true,{}:默认情况下是false. scope = false 首先我们来看

一招制敌 - 玩转 AngularJS 指令的 Scope (作用域)【转】

学习了AngularJS好长时间,最近再次回首看看指令这部分的时候,觉得比自己刚开始学习的时候理解的更加深入了,尤其是指令的作用域这部分. 当初看的是<AngularJS权威指南>这本书,但是感觉这本书关于这方面讲的不是很细致,另外吐槽一下,这本书中文版印刷的质量不是很好,很多地方都有错误:不过讲的还是可以的,是一本学习AngularJS的好书. 下面我们就来详细分析一下指令的作用域.在这之前希望你对AngularJS的Directive有一定的了解,不然你对下面部分的理解可能会有一点难度.

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

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

Angularjs(十二):独立作用域

本篇将会总结下面的内容: 1 为何需要独立作用域 2 如何实现独立作用域 3 作用域的数据绑定 之前有一些错误,是由于replace拼写错误导致的. 拼写正确后,网友发现报错,无法正常工作.这是因为模板中存在单标签<br>,导致模板无法正确解析~ 再次感谢博友们提出的错误! 独立作用域的作用 为了便于理解,先看一下下面这个例子: <!doctype html> <html ng-app="myApp"> <head> <meta h