Service 角度服务未在模型更改时更新

Service 角度服务未在模型更改时更新,service,angularjs,Service,Angularjs,在五月应用程序中,我有一个保存我的任务的服务: app.factory('Tasks', function () { var tasks = []; return { getAll: function () { return tasks; }, addOne: function (task) { tasks.push(task); }, openBy: function(owner) { return _.w

在五月应用程序中,我有一个保存我的任务的服务:

app.factory('Tasks', function () {
    var tasks = [];
    return {
        getAll: function () { return tasks; },
        addOne: function (task) { tasks.push(task); },
        openBy: function(owner) {
            return _.where(tasks, {owner: owner, status: 'open'});
        },
        doneBy: function(owner) {
            return _.where(tasks, {owner: owner, status: 'closed'});
        },
    };
});
然后,我根据所有者显示其打开的任务或关闭的任务

问题是当我使用
tasks.addOne(task)更新任务时使用
任务的视图。openBy(所有者)
不会得到更新。使用
Tasks.getAll()
do的任务

这是因为我要返回一个新数组吗?如果是这样,有没有办法告诉控制器更新它所拥有的?还是说我一开始就完全错了,有没有更好的方法

任何帮助都将不胜感激


Matthew

您可以在控制器(或指令)中调用openBy函数,而不是在视图中调用,并将其包装到$scope.$watch调用中。例如:

// Controller body
app.controller('TasksCtrl', function($scope, Tasks) {
  $scope.allTasks = Tasks.getAll();
  $scope.$watch('allTasks', function() {
    // Assume owner is the user and it's initialised somewhere above
    $scope.ownedTasks = tasks.openBy(owner);
  }, true);
});

这应该行得通,尽管我认为可能会做一些更优雅的事情

是的,问题是您在
openBy(owner)
上返回了一个新数组,之后不会更改/更新该数组。一种解决方案是始终使用
getAll()
,然后直接在视图上按用户/状态进行筛选(即任务中的
task |筛选:{owner:owner,status:'open'}
)。我已经尝试过了,但我需要它们在视图中是不同的模型,因为我正在从re arrangeAll上的索引更新键,我在$watch中添加了true作为第三个参数,现在它似乎开始工作了。谢谢