Javascript 正在监视的角度重新加载资源
我认为这似乎是一个显而易见的问题,但我的大脑似乎有点兴奋 我有一个资源Javascript 正在监视的角度重新加载资源,javascript,angularjs,angular-resource,Javascript,Angularjs,Angular Resource,我认为这似乎是一个显而易见的问题,但我的大脑似乎有点兴奋 我有一个资源 Book = $resource("/books/:id", {id: "@id"}); book = Book.get(1); 我想刷新对象以从服务器获取更改。 我知道我可以通过重复book=book.get(book.id)来做到这一点,但这意味着页面上正在观看book的所有内容都将暂时为空,直到查询返回,并且对其进行操作的函数可能会崩溃 我想向实例添加一个重载方法,一旦查询从服务器返回,该方法将更新任何更改的字段。到
Book = $resource("/books/:id", {id: "@id"});
book = Book.get(1);
我想刷新对象以从服务器获取更改。
我知道我可以通过重复book=book.get(book.id)
来做到这一点,但这意味着页面上正在观看book
的所有内容都将暂时为空,直到查询返回,并且对其进行操作的函数可能会崩溃
我想向实例添加一个重载方法,一旦查询从服务器返回,该方法将更新任何更改的字段。到目前为止,我最好的尝试是:
$reload = function() {
var model = this;
Book.get(model.id, function(data) { // success
angular.forEach(data, function(value, key) {
model[key] = value;
}
}
}
两个问题
a) 这是一种“有棱角”的方式,还是有更优雅的方式?
a) 如何在定义资源时添加此$refresh方法,以便在创建的每个实例中都包含它?尝试扩展其原型:
var Book = $resource("/books/:id", {id: "@id"});
Book.prototype.reload = function(callback) {
return this.get(this.id, callback);
}
var book = Book.get(1);
book.reload(function(data){console.log(data);});
感谢:@mathew berg(mathew berg)对我的代码进行了修复。一些想法:
yourApp.factory('BookService', function($q) {
//Other API calls here
function reload() {
var deferred = $q.defer();
$http.get('/someUrl').
success(function(data, status, headers, config) {
//Massage your data here... then
deferred.resolve(data);
}).
error(function(data, status, headers, config) {
deferred.reject('There was a problem updating the books');
});
return deferred.promise;
}
return {
reload: reload
}
});
//In your conttroller or directive that holds your model
books = BookService.reload();
@num8er的解决方案在运行时都会崩溃。也许我们使用的是不同版本的angular?(我现在使用的是1.4.x。)特别是,我必须将
get()
更改为$get()
,但我也希望在不传递自定义回调的情况下重新加载对象,以从我调用的任何地方捕获它,所以我将其添加到内部部分
我必须做:
var Book = $resource("/books/:id", {id: "@id"});
Book.prototype.reload = function() {
var book = this;
book.$get(book.id, function (new_book) {
book = new_book; // replace old book object with newly reloaded one
});
};
var book = Book.get(1);
book.reload();