backbone.js更改Model的url参数,fetch不更新获取的数据

Vik*_*ram 12 javascript backbone.js

我有以下型号:

window.MyModel = Backbone.Model.extend({
     initialize: function(props){
          this.url = props.url;
     } 

     parse: function(){

          // @override- parsing data fetched from URL
     }


});

 // instantiate
  var mod = new MyModel({url: 'some/url/here'});
Run Code Online (Sandbox Code Playgroud)

我使用这个全局变量'mod'从后端获取一些数据到这个模型.

 // fetch

 mod.fetch({
       success: function(){ ...},
       error: ...

 });
Run Code Online (Sandbox Code Playgroud)

以上都适用....我的问题:我希望通过更改重置url并调用fetch来重用此模型,但它不会以某种方式更新url.我尝试过以下方法:

  mod.fetch({ 
       data: {url:'/some/other/url'},
       postData: true,
       success: function(){ //process data},
       error: ...
  });


 mod.set({url: '/some/other/url'});
 // called fetch() without data: and postData: attributes as mentioned in previous
Run Code Online (Sandbox Code Playgroud)

如何为我的模型设置url以便我可以调用fetch()并从更新的url中获取数据?我错过了什么.谢谢你的任何指示......

更新1:基本上,如果我这样做,我无法获得更新的值

    model.set({url: 'new value'}); 
Run Code Online (Sandbox Code Playgroud)

其次是

    model.fetch();
Run Code Online (Sandbox Code Playgroud)

'model'是一个全局变量.创建一个新的"模型"实例:

    model = new Model({url:'/some/other/url'}); 
    model.fetch();
Run Code Online (Sandbox Code Playgroud)

但是,按要求工作.这是否意味着模型实例永久地附加到URL并且无法重置?

对更新中的问题的回答1模型实例不会永久附加到网址.它可以动态重置.请仔细阅读@ tkone的详尽解释,然后阅读@fguillens的解决方案,以便更好地理解.

fgu*_*len 24

在了解了@tkone的解释之后......

如果你仍然希望拥有动态,Model.url你总是可以将它的结构延迟到运行时间,试试这个:

window.MyModel = Backbone.Model.extend({
  url: function(){
    return this.instanceUrl;
  },
  initialize: function(props){
    this.instanceUrl = props.url;
  } 
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以这样做:`mm = new MyModel; mm.url ='/ mynewurl /';`.Backbone对这些东西非常灵活. (4认同)

tko*_*one 11

那么这里的答案是你想做的:

mod.url = '/some/other/url'
Run Code Online (Sandbox Code Playgroud)

URL不是模型本身实例的一部分,而是MyModel您从中创建模型实例的对象的属性.因此,您只需将其设置为普通的JavaScript对象属性即可. set仅在您设置(或反过来get)的数据实际上是您要从服务器发送/接收的数据的属性时使用.

但是,为什么要更改URL是我们应该问的问题.Backbone的模型/收集系统背后的想法是,您与REST端点通信,每个模型都有一个相应的端点.

就像你有一个博客,该博客有一个"入口"对象,可在以下位置获得:

/rest/entry/
Run Code Online (Sandbox Code Playgroud)

而且你有一个Backbone模型用于Entry:

Entry = Backbone.Model.extend({urlBase: '/rest/entry'});
Run Code Online (Sandbox Code Playgroud)

现在当你savefetchBackbone知道这是如何工作的.

所以就像你正在制作一个新模型:

e = new Entry();
e.set({title: "my blog rulez", body: "this is the best blog evar!!!!1!!"});
e.save();
Run Code Online (Sandbox Code Playgroud)

这将使Backbone /rest/entry对正文执行HTTP POST请求:

{
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!"
}
Run Code Online (Sandbox Code Playgroud)

(当你做你的mod.set({url: '/some/other/url'});,你实际上添加了一个名为场url的数据集,所以服务器会发送"url": "/some/other/url"如上面JSON POST身体的一部分:

{
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!",
  "url": "/some/other/url" 
}
Run Code Online (Sandbox Code Playgroud)

然后,服务器将与具有相同模型的HTTP 200(或201)响应来响应,只能用一样,比方说,和ID附:

{
  "id": 1,
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!"
}
Run Code Online (Sandbox Code Playgroud)

这不是你想要的,对吧?)

现在你已经有了这个型号,它有一个ID.这意味着如果你改变它:

e.set('title', 'my blog is actually just ok');
e.save()
Run Code Online (Sandbox Code Playgroud)

Backbone现在发出HTTP PUT请求/rest/entry/1以更新服务器上的资源.

服务器看到您在/rest/entry/端点上讨论ID 1 ,因此知道更新现有记录(并发回HTTP 200).

TL; DR

不要更改URL,Backbone会.为新数据创建新模型.