2014-10-06 30 views
0

我實現主複選框(在表頭),並進入複選框(在表中的行)的行爲,這是我的html:複選框行爲,在指令或控制器?

<div class="container main" ng-controller="ParamCtrl as param"> 

    . 
    . 
    . 
    <form> 

     <thead> 
      <input type="checkbox" ng-model="param.masterCheckBox" ng-click="param.clickMaster()" /> 
     </thead> 
     <tbody> 
      <tr ng-repeat="entry in param.entries track by $index"> 
       <input type="checkbox" ng-model="parameter.checked" ng-click="param.click($index)" /> 
      </tr> 
     </tbody> 


    </form> 

</div> 

主複選框和行復選框的行爲控制器內部實現(而不是控制器在指令中)。這是我的js文件(因爲這是工作,我刪除的功能內部的邏輯的話):

app.controller('ParamCtrl', function() { 

    this.function1 = function() {...}; 
    this.function2 = function() {...}; 
    . 
    . 
    . 
    this.clickMaster = function(){...}; 
    this.click = function(index){...}; 


}); 

我讀過很多次,控制器內DOM操作是不可取的,而應該是一個僞指令中。我還沒有完全理解AngularJS中的指令概念。我不確定複選框的行爲是否屬於DOM,請確認是否將它放在控制器中是正確的。我如何實現clickMaster的指令版本,並在控制器中放置這些控件是錯誤的(或不好的做法)時點擊函數?

app.controller('ParamCtrl',function(){...})使用這個工作得很好。但是,每當我改變與

app.controller('ParamCtrl', ['$scope', function($scope) {...}]) 

app.controller('ParamCtrl', function($scope) {...}]) 

控制器與$範圍源代碼替換的所有情況下,代碼不工作了。在我的Chrome開發工具調試中,$ scope(在兩種情況下都有變化)對ChildScope有價值。在我見過的代碼示例中,他們通常會使用$ scope而不是這個。有人可以解釋爲什麼它與這個而不是$範圍

謝謝。

回答

1

我認爲你在這些功能中做的唯一的事情就是在你的模型上設置值,以便複選框被選中或取消選中?在這種情況下,你的方法是有效的。

DOM操作意味着您正在從JavaScript內部更改DOM樹(HTML背後的模型)的結構。 DOM操作的例子包括創建新的DOM元素(document.createElement(<element name>)´ and using a query selector to retrieve a DOM element (either with jQuery or with built ins like document.getElementById();'

這個想法是限制DOM操作指令,因爲這些操作旨在增強您的HTML,因此這是在語義上正確的地方他們(還有其他一些原因,如避免內存泄漏)

+0

控制器內的代碼有點冗長和混亂。是否也可以將此複選框的行爲放入注入到控制器的工廠(或服務)中以便做一些重構?即使這是可能的,這是一個很好的做法嗎? – menorah84 2014-10-07 12:06:15