2012-07-27 90 views
12

我有以下型号:Backbone.js的更改模型的URL参数,并获取不更新数据获取

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'}); 

我用这个全局变量“国防部”将一些数据读取到从后端这种模式。

// fetch 

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

}); 

上述所有工作得很好.... 我的问题:我想通过改变重置网址重新使用这个模型,并调用取,但它不以某种方式更新网址。我曾尝试以下:

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 

如何设置的URL,我的模型,这样我可以调用取(),它从更新的URL获取数据?我错过了什么。感谢您的任何指针..

更新1:基本上,我不能,如果我没有

model.set({url: 'new value'}); 

其次

model.fetch(); 

'模型' 得到更新的值是一个全局变量。创建'模型'的新实例作品:

model = new Model({url:'/some/other/url'}); 
    model.fetch(); 

但是,按要求工作。这是否意味着模型实例永久连接到一个url并且无法重置?

对我的问题的回答在更新1中模型实例没有永久地连接到一个url。它可以动态重置。请仔细阅读@ tkone的详细解释,然后阅读@fguillens的解决方案以获得更好的理解。

+0

你为什么要更改URL? REST风格的web服务背后的想法是,您的对象始终可用于相同的URL(具有特定对象所需的ID) – tkone 2012-07-27 19:29:14

回答

24

后理解了@tkone的解释...

如果你也想有一个动态的Model.url你总是可以推迟建设运行时间,试试这个:

window.MyModel = Backbone.Model.extend({ 
    url: function(){ 
    return this.instanceUrl; 
    }, 
    initialize: function(props){ 
    this.instanceUrl = props.url; 
    } 
} 
+4

你可以这样做:'mm = new MyModel; mm.url ='/ mynewurl /';'以及。 Backbone对这些东西是非常灵活的。 – tkone 2012-07-30 13:22:40

+0

@fguillen - 谢谢!这延迟了建设运行时间做的窍门! – Vikram 2012-07-30 14:51:34

+0

@tkone - 再次感谢!为您所有有用的指针 – Vikram 2012-07-30 14:54:01

11

嘛这里的答案是,你想做的事:

mod.url = '/some/other/url' 

的网址并非模式本身的实例的一部分,而是您建立的MyModel对象的属性模型实例来自。因此,您只需将其设置为正常的JavaScript对象属性即可。 set仅用于当您正在设置的数据(或反之与get一起获取)实际上是要从服务器发送/接收的数据的属性。

但是,为什么你要更改URL是我们应该问的问题。 Backbone的模型/收集系统背后的想法是,你说的是一个REST端点,每个模型都有一个对应的端点。

就像你有一个博客,该博客有一个“入口”对象,它可在:

/rest/entry/ 

而且你已经有了一个条目的骨干机型:

Entry = Backbone.Model.extend({urlBase: '/rest/entry'}); 

现在当你savefetch骨干知道如何工作。

所以像你正在做一个新的模式:

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

这会然后作出骨干做一个HTTP POST请求/rest/entry与身体:

{ 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

(当你做你的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" 
} 

服务器会再与相同型号的HTTP 200(或201)的响应进行响应,只与一样,再说了,ID附:

{ 
    "id": 1, 
    "title": "my blog rulez", 
    "body": "this is the best blog evar!!!!1!!" 
} 

而这不是你要找什么对吧?)

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

e.set('title', 'my blog is actually just ok'); 
e.save() 

骨干使得现在的/rest/entry/1 HTTP PUT请求来更新服务器上的资源。

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

TL; DR

不要更改URL,Backbone会。为新的数据创建一个新模型。

+0

感谢您的解释!我有一个模型和URL参数与此相关联。当我初始化这个模型时,我传递一个url值并调用fetch()。现在我想改变这个'url'值,因为获取到这个模型中的数据仍然会有相同的参数:例如url1:/ top; url2:/ top/filter1; url3:/ top/filter2。我不确定这是否是好的做法,但所有3个URL都会从后端返回相同的数据,除非按指定进行过滤。我需要根据点击的“标签”在网址之间切换。正如你所提到的,我可以拥有多个模型,但我在考虑是否可以重用。 – Vikram 2012-07-27 20:01:54

+0

让我知道你在想什么 – Vikram 2012-07-27 20:02:11

+0

@Vikram,所以你只想找回由过滤器参数过滤的有限数据集?我会建议为每组数据创建一个新的集合,并更改集合的'url'属性。所以你需要一个名为'filter1'的集合,其URL属性被设置为'/ top/filter1',依此类推。 – tkone 2012-07-27 20:04:38

3
model.urlRoot = "/your/url" 

OR

model.urlRoot = function(){ return "/your/url"; } 

OR

model.url = "/your/url" 

OR

model.url = function(){ return "/your/url"; } 

默认 'URL' 一个Backbone.Model对象的属性是如下。 Backbone.js文档说:

模型在服务器上的表示的默认URL - 如果您使用Backbone的宁静方法,请覆盖此值以更改将被调用的端点。

url: function() { 
    var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

显然,它首先获取urlRoot的值,如果不提供,它会看哪个模型属于集合的URL。通过定义urlRoot而不是url,在urlRoot为null的情况下具有回退到集合url的优点。

+0

感谢您花时间回答!我正在寻找一种方法来根据我的应用程序生成的url动态地切换模型中的网址。我检查的答案对我来说效果很好。 – Vikram 2012-07-30 17:34:55

0

您可以设置URL作为取功能选项,如:

var mod = new MyModel(); 
mod.fetch({ 
    url: '/some/other/url', 
    data: {} 
});