$ resource不更新视图

时间:2013-02-26 10:42:20

标签: view resources angularjs updates

我有一个非常简单的资源如下:

angular.module('ExampleServices', ['ngResource']).

        factory('NoteService', function($q, $rootScope, $resource){
        var baseurl = "/api/v1/note/";
        var Note = $resource(baseurl, {}, {

            // get notes method    
            get_for_model: {
                method: 'GET',
                params:{user: '', object_id: ''},
                isArray: false
            },

            // leave note method
            leave_note: {
                method: 'POST',
            }

        });
        return Note
    }
);

在控制器中,我按如下方式调用leave_note方法:

$scope.note = function(){
        $scope.note = NoteService.leave_note({
            desc: desc,
            title: title,
            object_id: oid,
        }); 
    }

这基本上将POST方法调用到我的应用程序rest API并创建对象。刷新页面后,我可以看到notes中列出的注释。但至于我的知识$resource应该自己更新视图。

来自docs

的报价
  

重要的是要意识到调用$ resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。

我无法在$rootScope.$apply方法中使用leave_note,直到我将其定义为函数(如下所示:)

leave_note: function(){
    var note = New Note();
    note.desc = desc;
    note.title = title;
    note.object_id = oid;
    note.$save();
    $rootScope.$apply();
}

但在上述情况下,发送到REST api的调用具有undefined请求方法。

我能想到的另一个问题是我没有定义$scope.note但是$scope.notes这是REST api发送的备注列表。所以也许$scope.note正在更新,但由于我没有渲染note对象,而是在模板中使用notes渲染ng-repeat,我无法看到模板中的更改。

我还尝试在保存新笔记后重新获取笔记对象,但它基本上删除了所有笔记,然后重新渲染所有看起来很难看的笔记(几乎就像页面刷新一样)。

我想要实现的是,只要保存note对象,我就希望将新笔记合并到现有笔记中。请指导我。感谢

1 个答案:

答案 0 :(得分:1)

您无需使用$rootScope.$apply,您的错过了解$resource API文档。

正如$resource文档所述:“从服务器返回数据后,现有参考将填充实际数据。”。这意味着当您执行$scope.notes = NoteService.get_for_model();时,您要求$scope.notes填充从NoteService.get_for_model GET请求收到的(未来)数据。 $resource API将负责执行此操作 - 更新$scope.notes模型 - 仅此而已。请注意,未提及,当您对同一服务进行POST时,您的数据会自动更新。

如果您想在添加新笔记(POST)后更新$scope.notes模型,并且不想请求整个笔记列表,请尝试将新笔记直接添加到$scope.notes模型中在POST 成功回调:

 var note = NoteService.leave_note({
            desc: desc,
            title: title,
            object_id: oid,
        }, function() {
            $scope.notes.push(note.$get());                
        }
 );

请注意,这可以大大改进(即避免$get),但由于我不知道您的实现的具体细节,我刚刚提供了一个通用的解决方案。