簡體   English   中英

angularjs,$ scope參數在后台如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM