2013-06-26 4 views
-2

Мне нужно получить объект DOM через jQuery элемента с ng-кликом внутри контроллера.Получить объект в контроллере

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(); ничего не происходит.


Edit: Это не правильный способ, чтобы скрыть элемент в Угловом! Это просто используется в качестве примера! Скрыть элементы с помощью ng-hide.

+2

Я думаю угловой путь был бы более в линиях 'нг-шоу =' (не уверен насчет точного синтаксиса), а не «isInEditMode!» внешняя манипуляция дома – 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(); 
}; 

Примечания: это не считается хорошим практика с Угловой. Предполагая, что ваша функция editMode ничего не скрывает, вы можете достичь ее с помощью директивы ng-hide или ng-show, как указано в комментарии к вашему вопросу.

+2

Действительно? Ваше решение состоит в том, чтобы выполнять манипуляции с DOM для чего-то, что может быть разрешено декларативно с помощью 'ng-hide'? Это _bad_ Angular. Более того - похоже, что это не очень проверяемо, что я концептуально делаю, это скрытие элемента, а не цель какого-либо события, когда эта функция выполняется. –

+0

@BenjaminGruenbaum - Мое решение просто отвечает на вопрос в его текущей форме. Я согласен, это не идеальное решение Angular. Я также предполагаю, что функция в действительности делает гораздо больше, чем просто скрыть элемент. –

+1

@JamesAllardice ответы, предлагающие альтернативные пути _very_ приемлемо. Ответы на преподавание плохой практики, не говоря о том, что это плохая практика, тем более. –

4

Как я уже сказал в своем комментарии, у вас должна быть модель данных резервного копирования и есть реакции, объявленные в вашем угловом 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; 
    }; 
};