[英]angularjs, how $scope parameter works behind the scenes?
控制器將匿名函數作為第二個參數。
我有兩個控制器示例,一個使用匿名函數將nothing作為參數,第二個使用$scope
對象。
“位於幕后”的angularjs如何檢測我的匿名函數是否帶有參數? 以及如何在自定義js方法中模仿呢?
controller('ctrl',function(){
console.log( arguments[0] ); // ->> undefined
});
VS
controller('ctrl',function($scope){
console.log( arguments[0] ); // ->> js object
});
我在想的偽代碼是這樣的:
( if F has parameters ) F.bind($scope) // or F.call(....)
作為記錄在這里
Angular將使用指定的Controller的構造函數實例化一個新的Controller對象。 將創建一個新的子作用域,並將其作為可注入參數提供給Controller的構造函數$ scope。
因此,傳遞給Controller的構造函數的第一個參數是子作用域實例$ scope。 由於arguments
對象是與傳遞給函數的參數相對應的類似Array的對象,因此打印arguments [0]將打印第一個傳遞的參數(即$ scope)。
這是angular的依賴注入的工作方式:它查看args名稱,然后查找它以知道要注入什么。
您可以在此處找到特定的代碼:
https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L72
Angular從三個位置之一獲取要注入的對象的名稱(僅使用存在的對象中的第一個):
$inject
屬性 toString()
並從中提取名稱來檢查該函數實際期望的參數。 一旦具有名稱列表,注入器將首先在可傳遞給注入器的映射對象中找到對象,然后在已注冊到可用角度模塊中的對象中找到對象。 再次使用第一個匹配對象,因此調用控制器的代碼將唯一的$scope
對象傳遞給每個控制器的注入器,但是您可以使用的大多數其他名稱(例如,用於服務)都是單例,並且每次都重復使用同一對象。
您可以自己使用注射器:
var injector = angular.injector();
function MyFunction(something) { ... }
injector.invoke(MyFunction, this, { something: anObject });
參見https://docs.angularjs.org/api/auto/service/ $ injector
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.