2013-06-26 97 views
-2

我需要通過控制器內部的ng-click元素通過jQuery獲取DOM對象。獲取控制器中的對象

HTML

<ul> 
    <li ng-repeat="data in list"> 
     <span ng-click="editMode(this, data.id)">edit</span> 
    </li> 
</ul> 

控制器

$scope.editMode = function(obj, id) { 
    $(obj).hide(); //do not use jQuery hide() in angular! I's just a test! 
} 

變量OBJ有一個元素,但我不能使用它。 如果我嘗試$(obj).hide();什麼也沒有發生。


編輯:這不是隱藏元素在角正道!它只是用作示例!用ng-hide隱藏元素。

+2

我猜角的方式會更在'NG秀行='(約精確語法不知道),而不是「isInEditMode!」外部dom操作 – Esailija

+0

就像我在下面的評論中所說的,這只是爲了測試。我知道ng-hide和ng-show。謝謝! – StinsonMaster

+0

同樣適用於任何jQuery方法,不只是隱藏 – Esailija

回答

3

在你的例子中this指的是當前角度爲$scope的實例,而不是元素。獲取該元素的最簡單的方法是通過事件對象:

<span ng-click="editMode($event, data.id)">edit</span> 

然後在處理程序可以訪問目標元素:

$scope.editMode = function(e, id) { 
    $(e.target).hide(); 
}; 

注意:這是沒有考慮好與Angular一起練習。假設你的editMode函數除了隱藏一個元素之外什麼都不做,你可以通過ng-hideng-show指令來實現它,就像在你的問題的評論中提到的那樣。

+2

真的嗎?你的解決方案是使用'ng-hide'來聲明性地解決某些東西的DOM操作?這是_bad_ Angular。更重要的是 - 這看起來不是非常可測試的,我在概念上做的是隱藏元素,而不是執行此函數時的某個事件的目標。 –

+0

@BenjaminGruenbaum - 我的解決方案只是回答當前形式的問題。我同意,這不是理想的Angular解決方案。我也假設現實中的功能遠不止隱藏一個元素。 –

+1

@JamesAllardice回答說,替代途徑是不可接受的。不要說這是壞習慣,而不是如此。 –

4

就像我在我的評論中說的,你應該有一個支持數據模型,並且在你的angular html中聲明反應。

這裏的例子小提琴:

http://jsfiddle.net/mVCkY/

<li ng-repeat="data in list"> 
    <span ng-click="editMode(data)" ng-hide="data.isInEditMode">edit</span> 
</li> 

function DataCtrl($scope) { 
    $scope.list = [{}, {}, {}]; 
    $scope.editMode = function(obj) { 
     obj.isInEditMode = true; 
    }; 
}; 
相關問題