我有一个非常简单的资源如下:
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
对象,我就希望将新笔记合并到现有笔记中。请指导我。感谢
答案 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
),但由于我不知道您的实现的具体细节,我刚刚提供了一个通用的解决方案。