Итак, я продолжаю читать, что манипуляция jQuery изнутри контроллера - это плохая практика, но я не понимаю, почему, или как исправить.Каков правильный способ запуска jQuery DOM Manipulation из контроллера?
Ниже приведен код из учебника Youtube, в котором даже комментарии создателя видео являются плохими идеями, но не объясняют причину и продолжают использовать плохое поведение в любом случае.
От https://www.youtube.com/watch?v=ilCH2Euobz0#t=553s:
$scope.delete = function() {
var id = this.todo.Id;
Todo.delete({id: id}, function() {
$('todo_' + id).fadeOut();
});
};
РЕШЕНИЕ:
На основании ответа Лэнгдона ниже, я прибыл на следующий рабочий код для моей собственной работы, которая вытекает несколько из примера кода выше :
var ProjectListCtrl = function ($scope, Project) {
$scope.projects = Project.query();
$scope.delete = function() {
var thisElem = this;
var thisProject = thisElem.project;
var id = thisProject.id;
Project.delete({id: id}, function() {
var idx = $scope.projects.indexOf(thisProject);
if (idx !== -1) {
thisElem.destroy('removeItem('+idx+')');
}
});
}
$scope.removeItem = function(idx) {
$scope.projects.splice(idx, 1);
}
}
app.directive('fadeOnDestroy', function() {
return function(scope, elem) {
scope.destroy = function(funcComplete) {
elem.fadeOut({
complete: function() {
scope.$apply(funcComplete)
}
});
}
}
});
Это отличается от ответа Лэнгдона несколькими путями. Я хотел избежать добавления параметра в обратный вызов ngClick
, поэтому я храню его в thisProject
. Кроме того, пример и мой код необходимо вызвать destroy
из $http
успешным обратным вызовом, поэтому вместо this
, который больше не уместен, я сохраняю элемент с щелчком в thisElem
.
UPDATE 2:
Обновленный мое решение в дальнейшем, чтобы отразить, что funcComplete фактически не модифицируя исходный $ объем.
Там нет правильный способ сделать DOM манипуляции в угловых контроллерах. Для этого нужны директивы. См. [Как мне «думать в AngularJS», если у меня есть фон jQuery?] (Http://stackoverflow.com/a/15012542/1095616). – Stewie