2017-08-03 66 views
1

將這個問題標記爲重複之前...我知道你在想什麼,這已被問過無數次,但不完全是。

我從各種渠道知道我的研究(包括官方文檔和角度宗師的和傳道者)時,該$onInit塊通常保留給初始化工作/邏輯依賴角已經完成了所有它的綁定的。

但是,變量初始化並不適合這個「工作/邏輯」定義。特別是沒有任何角度邏輯的變量。出於這個原因,ES6構造函數似乎更適合變量初始化。這同樣適用於那些需要lexicaly界範圍回調,像這樣的方法綁定:

class myController() { 
    constructor() { 
    this.myVariableOne = 1, 
    this.myVariableTwo = 2, 
    this.myVariableThree = 3; 

    this.myMethod = this.myMethod.bind(this); 
    } 

    $onInit() { } 

    myMethod() { 
    console.log(this.myVariableOne, this.myVariableTwo, this.myVariableThree); 
    } 
} 

雖然這看起來不錯,在下面的所作所爲事「的角度方式」儘可能僅使用$onInit塊初始化工作/邏輯,我也看到很多人說角度控制器類構造函數只能用於依賴注入設置

所以,這讓我感到困惑。構造函數似乎是變量初始化和方法綁定的最佳選擇,並且$onInit看起來好像並不真正適合該角色,但它確實不清楚我應該如何使用它。有人可以幫我找出我應該把我的變量定義和方法綁定?

+1

在上面的代碼中沒有this.myVariableOne等 – estus

+0

哎呀,對不起,修正了 –

回答

2

這完全取決於這些屬性是什麼。對於初始靜態值(如上面的代碼),構造函數是適當的地方。

$onInit適用於DOM和數據綁定初始化代碼,它是1.5前預鏈接函數的直接配對。其他初始化代碼也可以出於可測性的原因放置在$onInit中。

考慮到有一些被稱爲在初始化實例(沒有原型)方法:

constructor() { 
    this.method =() => ...; 
} 

$onInit() { 
    this.method(); 
} 

,它可以像

const ctrl = $controller('...'); 
spyOn(ctrl, 'method').and...; 
ctrl.$onInit(); 
expect(ctrl.method).toHaveBeenCalled(); 

測試這將是不可能的窺探或模擬它是否在構造函數中被調用。

這種擔心會影響非模塊化ES5應用在更大程度上,是因爲他們的方法通常被定義爲this.method = ...和控制器prototype不容易達到,因爲沒有辦法導入的控制器構造。

+0

謝謝你的輸入!我同意'$ onInit'通常用於綁定初始化代碼,然而,在什麼情況下綁定?因爲我知道它用於綁定依賴於角度綁定的代碼,然而,使用'.bind()作爲範圍綁定聽起來更像是在控制器構造函數中看起來更好的非角度初始化的一部分。「 –

+1

我已經添加了一個說明。$ onInit用於* data * binding。'this.myMethod.bind(this)'絕對屬於一個構造函數。越早完成,越好。 – estus

1

我同意你的一般評估。我保持我的構造函數非常輕,但如果我在實例化中做的事情並非真正與角度相關,我一直將它們放入構造函數中。我沒有與他們有任何問題。我只看了十幾個,我基本上沒有做任何事情,只是初始化屬性併爲屬性分配依賴注入。我只有一個控制器,它根本就調用任何外部代碼。

有關角1.5的寫法非常稀疏。如果你還沒有看到這個:https://toddmotto.com/rewriting-angular-styleguide-angular-2我認爲這是最好的風格指南「現代angularjs。「

+0

謝謝!另外,我已經是Todd Motto和John Papa的追隨者,但John Papa在Angular 1中使用類是非常有限的,而Todd Motto提議''onInit'應該用於所有事情,包括變量init ialization。然而,這擴大了'$ onInit',並且在讀了很多東西之後(不是從ng-docs中得到的,因爲正如你所說他們非常稀疏),它看起來不太合適。但感謝您的意見! –

+0

@ sgarcia.dev託德格言是一個很好的開發者,但他在這裏錯了。這與其他問題相矛盾。即在TypeScript中定義道具類和構造函數是自然的(在A1中也是這樣),但在這種情況下,它們將在構造函數中初始化。 – estus

+0

@ sgarcia.dev我一直習慣於將我能從OnInit發佈到postlink的內容推遲到我的onInit儘可能輕。 –

相關問題