-1

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

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,应该自行更新观点。

文档中引用

重要的是要意识到调用 $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保存了对象,我希望将新笔记合并到现有笔记中。请指导我。谢谢

4

1 回答 1

1

您不需要使用$rootScope.$apply,您的小姐了解$resourceAPI 文档。

正如$resource文档中提到的:“一旦从服务器返回数据,现有引用就会填充实际数据。” . 这意味着当您这样做时,$scope.notes = NoteService.get_for_model();您要求$scope.notes填充从NoteService.get_for_modelGET 请求接收到的(未来)数据。API将$resource负责执行此操作——更新$scope.notes模型——仅此而已。请注意,它没有提到当您在同一服务上执行 POST 时您的数据将自动更新。

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

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

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

于 2013-02-26T12:31:40.877 回答