Also ich lese, dass jQuery Manipulation von einem Controller ist eine schlechte Praxis, aber ich bin nicht klar, warum, oder wie zu korrigieren.Was ist der richtige Weg, um jQuery DOM Manipulation aus einem Controller auszulösen?
Unten ist Code von einem Youtube-Tutorial, das sogar die Videokünstler Kommentare ist eine schlechte Idee, aber nicht erklären, warum und weiterhin das schlechte Verhalten sowieso.
Von 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();
});
};
SOLUTION:
unten auf Langdon Antwort Basierend, ich habe für meine eigene Arbeit am folgenden Arbeits Code angekommen, die über Code leicht aus dem Beispiel leitet :
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)
}
});
}
}
});
Dies unterscheidet sich von Langdons Antwort in einigen Punkten. Ich wollte vermeiden, einen Parameter zu dem ngClick
Callback hinzuzufügen, also speichere ich es in thisProject
. Außerdem muss das Beispiel und mein Code destroy
innerhalb eines $http
Erfolgsrückrufs aufrufen, so dass ich anstelle von this
, das nicht mehr relevant ist, das geklickte Element in thisElem
speichern.
UPDATE 2:
meine Lösung weiter aktualisiert, um widerzuspiegeln, dass funcComplete nicht tatsächlich die ursprünglichen $ Umfang modifiziert wurde.
Es gibt keine richtige Art und Weise DOM-Manipulationen in Angular-Controller zu tun. Dafür gibt es Richtlinien. Siehe [Wie kann ich in AngularJS denken, wenn ich einen jQuery-Hintergrund habe?] (Http://stackoverflow.com/a/15012542/1095616). – Stewie