所以我一直在阅读,从控制器中进行 jQuery 操作是不好的做法,但我不清楚为什么或如何纠正。
下面是来自 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
.
更新 2:
进一步更新了我的解决方案,以反映 funcComplete 实际上并未修改原始 $scope。