$资源不更新视图
我有一个非常简单的资源如下:
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
重要的是
报价意识到调用$资源对象方法立即返回一个空引用(对象或数组取决于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
对象,我希望将新音符合并到现有音符中。请指导我。谢谢
您不需要使用$rootScope.$apply
,您错过了解$resource
API文档。
正如$resource
文档中提到的:“一旦数据从服务器返回,现有引用就会填充实际数据。”。这意味着当您执行$scope.notes = NoteService.get_for_model();
时,您要求使用从NoteService.get_for_model
GET请求收到的(未来)数据填充$scope.notes
。 $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
),但因为我不知道你的实现的具体细节,我只是提供了一个通用的解决方案。
感谢您抽出时间回复。我实际上最终使用了'$ scope.notes.push(note)',它确实更新了数据。干杯! – Amyth 2013-02-26 12:45:19
downvoter?请解释你的downvote。 – Amyth 2013-02-26 10:54:22