2014-02-28 107 views
1

因此,我一直在與同事討論創建AngularJS控制器的「正確方法」。我知道有幾種創建方法,但我有興趣讓我的團隊以同樣的方式和「正確」的方式寫他們。通過「正確的方式」,我正在談論易讀,可測試和高性能。我確信有關於創建控制器的最佳方法的競爭理論,但是我最感興趣的是在一天結束時的測試能力,因爲這是AngularJS的成就。AngularJS控制器:正確的方法

事不宜遲,這裏的競爭者:

讓我們假設我們的應用程序被宣佈爲這樣:var app = angular.module('app',[]);

app.controller('myCtrl', function(){ 
    ... 
}); 

2.

function myCtrl = { 
    ... 
} 
app.controller('Ctrl', myCtrl); 

(function(app) { 
    app.controller('myCtrl', function() { 
    ... 
    } 
})(app); 

請讓我知道如果我錯過了一個。

這並沒有考慮到,所以請不要在添加到此對話需要縮小的變化。

謝謝! (我希望這不會開始一場火焰戰爭> <)

回答

1

我的團隊只使用1.我也考慮過3,並且我們只有一個關於全局級代碼的常規規則(和jshint約束)。我絕不會使用2.

0

Angular團隊最近發佈了一個最佳實踐指南,因此可能是開始的一個好地方:http://blog.angularjs.org/2014/02/an-angularjs-style-guide-and-best.html。此外,本演示文稿還討論了有關創建控制器的一些最佳做法:https://docs.google.com/presentation/d/1OgABsN24ZWN6Ugng-O8SjF7t0e3liQ9UN7hKdrCr0K8/present?pli=1&ueb=true&slide=id.p

如果您使用的是2號,則您並不需要app.controller('Ctrl', myCtrl);。你可以從ng-controller引用控制器,即使它沒有被定義爲module.controller(...)

你可能還想考慮讓你的控制器像JavaScript那樣允許並使用'controller as'語法。

var myApp = angular.module("myApp", []); 

myApp.MyCtrl = function($log) { 
    this.$log = $log; 
} 

myApp.MyCtrl.prototype.sayHello = function() { 
    this.$log('hello'); 
} 

在某些情況下,讓您的控制器可以全局訪問會很有用。就像如果你想用$ injector.instantiate()創建你的控制器實例一樣,你需要訪問它的構造函數(儘管你可以使用$ controller服務來使用字符串來實現相同的目標)。

var myCtrl = $injector.instantiate(myApp.MyCtrl); //Works 
var myCtrl2 = $injector.instantiate('MyCtrl'); //Doesn't Work 

但是,如果你沒有,讓你的控制器的全局,你或許應該module.controller(...);封裝它們具體的使用情況。

這個答案也提倡使用module.controller()https://stackoverflow.com/a/13363482/373655

+0

Thanks @rob!我一定會檢查他們的風格指南和最佳實踐。 – dganoff

1

我總是這樣說:

angular.module('myModule').controller('MyController', ['$scope', function($scope) { 

    <stuff> 

}]); 

是的,這是一個有點冗長,但它在全球範圍內創造什麼,這是很清楚什麼控制器屬於的模塊,如果我需要將我的控制器分離到另一個文件中,我只需複製並過去它,而不必擔心「應用程序」的定義位置或是否錯過了「。」。在鏈式聲明中。

我知道我應該忽略它,但當然這個版本是小型化安全的。

總的來說,我相信你應該找到一個明確的標準並堅持下去。那樣,如果某件事看起來不正確,你可以立即告訴。

相關問題