Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在监视的角度重新加载资源_Javascript_Angularjs_Angular Resource - Fatal编程技术网

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)对我的代码进行了修复。

一些想法:

  • 你的模型是如何构造的?从$resource文档中可以看出:“拥有一个空对象不会导致任何渲染,一旦数据从服务器到达,对象就会被数据填充,视图会自动重新渲染自身,显示新数据。”
  • 在角度服务中滚动您自己的API交互,以便您可以控制异步行为:

    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();