初學Angular遇到了點困惑,以下面這個控制器函數為例
function hello($scope) { $scope.name = '张三' }
這是個函數聲明,$scope理應是形參吧?可是把$scope改為其他標識符如s就不行了。可見$scope是hello函數被呼叫時傳入的實參。但這三行程式碼是函數的聲明,怎麼就傳入實參了呢?
我大概意識到了這不是一個正常的函數聲明,可能與Angular的控制器函數的綁定機制有關係?具體是怎樣的?
這種透過參數傳遞獲得依賴就是AngularJS的一大特性-依賴注入的體現之一。 但為什麼僅僅聲明了參數就可以獲得依賴?
AngularJS用$injector管理依賴的查詢與加載,例如
$injector
// 使用注入器加载应用 var injector = angular.injector(['ng', 'myApp']); // 通过注入器加载$controller服务 var $controller = injector.get('$controller'); var scope = injector.get('$rootScope').$new(); // 加载控制器并传入一个作用域 var MyController = $controller('MyController', {$scope: scope})
如果沒有顯示聲明,$injector根據參數名稱推斷依賴關係,這時候參數的順序沒什麼意義。 也就是說我們也可以這樣聲明:
angular.module('myApp') .controller('MyController', ['$scope', 'greeter', function(renamed$scope, renamedGreeter) { //do something }]);
嗯這東西寫在那裡就是個函數聲明,形參叫什麼名字是否重要完全由讀的人決定,ECMAScript 標準的解析器覺得不重要(我猜),但是Angular 自己拿js 寫了個"js"解析器。 。 。這樣函數形參的名字就重要了
Scope(作用域) AngularJS中的$scope 物件在這裡就是要將 域模型 暴露給視圖(模板)。只要把屬性設定給scope實例,就可以在模板渲染時得到這個值。 Scopes(作用域)也可以針對特定的視圖來擴展資料和特定的功能。只要在scope 實例上定義一些函數就能將特定的 UI 邏輯暴露給了模板。 例如,你可以為 name 變數建立一個 getter 方法,如下所示: var HelloCtrl = function ($scope) { $scope.getName = function() { return $scope.name; }; } 然後像下面這樣在模板中使用:<h1>Hello, {{getName()}} !</h1> $scope 物件讓我們可以非常精確的控制這個域內的模型的哪一部分,以及哪些操作在視圖層是可用的。理論上來講,AngularJS的scopes非常類似MVVM模式的ViewModel。
Scope(作用域)
AngularJS中的$scope 物件在這裡就是要將 域模型 暴露給視圖(模板)。只要把屬性設定給scope實例,就可以在模板渲染時得到這個值。
Scopes(作用域)也可以針對特定的視圖來擴展資料和特定的功能。只要在scope 實例上定義一些函數就能將特定的 UI 邏輯暴露給了模板。
例如,你可以為 name 變數建立一個 getter 方法,如下所示:
var HelloCtrl = function ($scope) { $scope.getName = function() { return $scope.name; }; }
然後像下面這樣在模板中使用:<h1>Hello, {{getName()}} !</h1>
<h1>Hello, {{getName()}} !</h1>
$scope 物件讓我們可以非常精確的控制這個域內的模型的哪一部分,以及哪些操作在視圖層是可用的。理論上來講,AngularJS的scopes非常類似MVVM模式的ViewModel。
http://note.sdo.com/u/635412003927148913/n/s6cBN~lcIHwG4M1-Y000LW
這種透過參數傳遞獲得依賴就是AngularJS的一大特性-依賴注入的體現之一。
但為什麼僅僅聲明了參數就可以獲得依賴?
AngularJS用
$injector
管理依賴的查詢與加載,例如如果沒有顯示聲明,
$injector
根據參數名稱推斷依賴關係,這時候參數的順序沒什麼意義。也就是說我們也可以這樣聲明:
嗯這東西寫在那裡就是個函數聲明,形參叫什麼名字是否重要完全由讀的人決定,ECMAScript 標準的解析器覺得不重要(我猜),但是Angular 自己拿js 寫了個"js"解析器。 。 。這樣函數形參的名字就重要了
http://note.sdo.com/u/635412003927148913/n/s6cBN~lcIHwG4M1-Y000LW