2013-08-19 26 views
0

我需要編寫一個指令,將控制器的作用域設置爲它。裏面有輸入和按鈕。當點擊某個按鈕時,它會調用$ scope.refresh(),它將模型值傳遞給某些網格以使其刷新。如何向控制器添加屬性或在角度中自定義控制器

大多數事情都很好。我將模型綁定到內部輸入中,使用ng-click綁定按鈕單擊事件並調用refresh()方法。但在刷新功能中,我需要獲取數據表的ID並與之交互。現在我只能通過ng-click的方法參數傳遞它。代碼如下:

<div ng-controller="MyController"> 
    <input ng-model="year"/> 
    ........ 
    <button ng-click="refresh('grid1, grid2')">Refresh</button> 
    <button ng-click="reset()">Reset</button> 
</div> 

我認爲它看起來很醜。如果Grid ID需要在其他方法中重用,我必須多次傳遞它,但我不知道如何將attr傳遞給控制器​​或擴展Controller。有沒有一種很好的方法來實現這樣的事情?

<div my-controller="MyController" grids='grid1, grid2' charts='chart1,chart2' ...> 
    <input ng-model="year"/> 
    ...... 
    <button ng-click="refresh()">Refresh</button> 
    <button ng-click="reset()">Reset</button> 
</div> 

或者,也許這個想法是不好的。我應該更好地用另一種方式來完成這項工作嗎?

更新:

的使用情況是這樣的:

我需要創建其中包含一些輸入(經由transclusion我猜)可重複使用的組件作爲查詢。該組件與一些外部網格和圖表綁定(不幸的是,它們不是指令)。組件中有按鈕使用ng-click觸發refreshGrid或refreshCharts動作。它需要網格和圖表ID來調用動作中的setQuery()方法,並將模型(輸入值)傳遞給方法。這就是爲什麼我需要將ID傳入組件或動作。

我使用ng-controller的原因是爲了創建一個新的隔離範圍。

回答

0

我認爲這種方法很好,但是如果您想將網格重構爲自己的指令,您可以通過link function中的「元素」變量訪問DOM元素。

如果您需要根據ng-click指令來執行某些操作,則可以在指令中觀察範圍變量,或者在根範圍上偵聽廣播並在指令中執行操作。事情是這樣的:

<div id="dataGrid1" my-app-directive="fireACtion" ng-click="fireAction = !fireAction" /> 

然後在你的指令,只是看attrs.myAppDirective(這是fireAction)

scope.$watch(attrs.myAppDirective , function (newVal, oldVal) { 
    //When the value changes, this will run 
} 

這將封裝的指令內的所有這樣的邏輯,你也將繼承控制範圍。

+0

好的方法去。但是由於控制器中有很多操作/ ng單擊,我需要將它們放入控制器屬性中,就像我的第二個代碼片段所示。我將「我的控制器」與ng-controller一起放在同一個div元素中,就像你的方式一樣,內部的doms不見了。它與「transclude」屬性有關嗎? –

+0

也許我不理解你的用例,但是如果你把這個指令放在實際的網格上,每個網格都會獨立運行。所以如果你有10個網格,並且你想在這些網格上有5個動作,你只需要一個包含5個手錶的指令 - 每個動作一個。你已經從控制器中刪除所有這些管道並將其放入可重用指令中。 – BoxerBucks

+0

我更新了這個問題並提出了用例。 –