AngularJs學習第五篇從Controller控制器談談$scope範圍_AngularJS

來源:互聯網
上載者:User

Controller的建立

AngularJs controller使用無處不在,在裡代碼示範比較簡單的建立工作。

<!DOCTYPE html><html xmlns="http://www.w.org//xhtml" ng-app="exampleApp"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-"/><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"><h>Count</h><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"><h>Count</h><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"><h>Count</h><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"><h>Count</h><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"><h>Count</h><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"><h>Count</h><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時 要明白其範圍。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.