AngularJS 依賴注入

2018-07-26 16:38 更新

injector ,我從 ng 的文檔中得知這個概念,之后去翻看源碼時了解了一下這個機制的工作原理。感覺就是雖然與自己的所想僅差那么一點點,但就是這么一點點,讓我感慨想象力之神奇。

先看我們之前代碼中的一處定義:

app.controller('BoxCtrl', function($scope, $element){});

在這個函數(shù)定義中,注意那兩個參數(shù): $scope , $element ,這是兩個很有意思的東西??偟膩碚f,它們是參數(shù),這沒什么可說的。但又不僅僅是參數(shù)——你換個名字代碼就不能正常運行了。

事實上,這兩個參數(shù),除了完成“參數(shù)”的本身任務(wù)之外,還作為一種語法糖完成了“依賴聲明”的任務(wù)。本來這個函數(shù)定義,完整的寫法應(yīng)該像 AMD 聲明一樣,寫成:

app.controller('BoxCtrl',
                [ '$scope', '$element',
                  function($scope, $element){}
                ]
              );

這樣就很明顯,表示有一個函數(shù),它依賴于兩個東西,然后這兩個東西會依次作為參數(shù)傳入。

簡單起見,就寫成了一個函數(shù)定義原本的樣子,然后在定義參數(shù)的名字上作文章,來起到依賴聲明的作用。

在處理時,通過函數(shù)對象的 toString() 方法可以知道這個函數(shù)定義代碼的字符串表現(xiàn)形式,然后就知道它的參數(shù)是 $scope 和 $element 。通過名字判斷出這是兩個外部依賴,然后就去獲取資源,最后把資源作為參數(shù),調(diào)用定義的函數(shù)。

所以,參數(shù)的名字是不能隨便寫的,這里也充分利用了 js 的特點來盡量做到“反省”了。

在 Python 中受限于函數(shù)名的命名規(guī)則,寫出來不太好看。不過也得利于反省機制,做到這點也很容易:

# -*- coding: utf-8 -*-

def f(Ia, Ib):
    print Ia, Ib

args = f.func_code.co_varnames
SRV_MAP = {
    'Ia': '123',
    'Ib': '456',
}

srv = {}
for a in args:
    if a in SRV_MAP:
        srv[a] = SRV_MAP[a]
f(**srv)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號