自從我開始學習AngularJS以來,我已經看到了從視圖調用控制器函數的不同方法。從AngularJS視圖中調用控制器函數
假設我們在AngularJS待辦事項列表應用程序,你可以添加和刪除待辦事項列表項:
function TodoListCtrl() {
var vm = this;
vm.addItem = addItem;
vm.removeItem = removeItem;
activate();
function activate() {
vm.list = [];
}
function addItem() {
vm.list.push(vm.newItem);
// reset the form
vm.newItem = null;
}
function removeItem(item) {
vm.list.splice(vm.list.indexOf(item, 1));
}
}
和HTML:
<h3>Todo List</h3>
<ul>
<li ng-repeat="item in vm.list">
{{ item }} <a ng-click="vm.removeItem(item)">Remove</a>
</li>
</ul>
<h4>Add Item</h4>
<input type="text" ng-model="vm.newItem" /> <button ng-click="vm.addItem()">Add</button>
在這個例子中addItem
功能取決於vm.newItem
被設置爲添加新的列表項目。然而,它也可以重新寫爲:
function addItem(item) {
vm.list.push(item);
// reset the form
vm.newItem = null;
}
隨着我們的HTML更新,所以:
<button ng-click="vm.addItem(vm.newItem)">Add</button>
我可以看到,這使得功能更易於測試,因爲我們不依賴於控制器的狀態,但我們不完全避免,因爲我們在添加項目後重置vm.newItem
。
當我們應該從我們的視圖傳遞參數,並且我們只能依賴控制器的內部狀態時,是否有最佳實踐?
我認爲這是一個每個案件的情況,在你的情況下應該不重要。在你的情況下,我會在按鈕上做一個'ng-disabled =「!vm.newItem」',也許在控制器函數中包含一個'if(item){}'。 – 2015-02-11 15:13:00
我不認爲這真的很重要......這與問你是否應該在java/c#類中使用字段值或將其他參數添加到方法中一樣。你可以在控制器中使用或不使用vm.newItem - 它仍然存在。 – 2015-02-11 15:18:31
謝謝,我已經更新了示例。 – 2015-02-11 16:10:10