Jaki jest właściwy sposób wyzwalania manipulacji jQuery DOM z poziomu kontrolera?

Czytam więc, że manipulacja jQuery z poziomu kontrolera jest złą praktyką, ale nie wiem, dlaczego i jak poprawić.

Poniżej znajduje się kod z samouczka Youtube, który nawet twórca wideo komentuje jest złym pomysłem, ale i tak nie wyjaśnia dlaczego i nadal używa złego zachowania.

Zhttps://www.youtube.com/watch?v=ilCH2Euobz0#t=553s :

$scope.delete = function() {
    var id = this.todo.Id;
    Todo.delete({id: id}, function() {
        $('todo_' + id).fadeOut();
    });
};

ROZWIĄZANIE:

Na podstawie poniższej odpowiedzi Langdona dotarłem do następującego kodu roboczego dla mojej pracy, który wywodzi się nieco z powyższego kodu przykładowego:

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)
                }
            });
        }
    }
});

Różni się to od odpowiedzi Langdona na kilka sposobów. Chciałem uniknąć dodawania parametru dongClick callback, więc przechowuję go wthisProject. Również przykład i mój kod muszą zadzwonićdestroy od wewnątrz$http oddzwanianie powodzenia zamiastthis co nie jest już istotne, przechowuję kliknięty element wthisElem.

AKTUALIZACJA 2:

Zaktualizowałem moje rozwiązanie, aby odzwierciedlić, że funcComplete nie modyfikował oryginalnego zakresu $.

questionAnswers(2)

yourAnswerToTheQuestion