Backbone.js的更改模型的URL参数,并获取不更新数据获取
我有以下型号: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的解决方案以获得更好的理解。
后理解了@tkone的解释...
如果你也想有一个动态的Model.url
你总是可以推迟建设运行时间,试试这个:
window.MyModel = Backbone.Model.extend({
url: function(){
return this.instanceUrl;
},
initialize: function(props){
this.instanceUrl = props.url;
}
}
嘛这里的答案是,你想做的事:
mod.url = '/some/other/url'
的网址并非模式本身的实例的一部分,而是您建立的MyModel
对象的属性模型实例来自。因此,您只需将其设置为正常的JavaScript对象属性即可。 set
仅用于当您正在设置的数据(或反之与get
一起获取)实际上是要从服务器发送/接收的数据的属性。
但是,为什么你要更改URL是我们应该问的问题。 Backbone的模型/收集系统背后的想法是,你说的是一个REST端点,每个模型都有一个对应的端点。
就像你有一个博客,该博客有一个“入口”对象,它可在:
/rest/entry/
而且你已经有了一个条目的骨干机型:
Entry = Backbone.Model.extend({urlBase: '/rest/entry'});
现在当你save
或fetch
骨干知道如何工作。
所以像你正在做一个新的模式:
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会。为新的数据创建一个新模型。
感谢您的解释!我有一个模型和URL参数与此相关联。当我初始化这个模型时,我传递一个url值并调用fetch()。现在我想改变这个'url'值,因为获取到这个模型中的数据仍然会有相同的参数:例如url1:/ top; url2:/ top/filter1; url3:/ top/filter2。我不确定这是否是好的做法,但所有3个URL都会从后端返回相同的数据,除非按指定进行过滤。我需要根据点击的“标签”在网址之间切换。正如你所提到的,我可以拥有多个模型,但我在考虑是否可以重用。 – Vikram 2012-07-27 20:01:54
让我知道你在想什么 – Vikram 2012-07-27 20:02:11
@Vikram,所以你只想找回由过滤器参数过滤的有限数据集?我会建议为每组数据创建一个新的集合,并更改集合的'url'属性。所以你需要一个名为'filter1'的集合,其URL属性被设置为'/ top/filter1',依此类推。 – tkone 2012-07-27 20:04:38
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的优点。
感谢您花时间回答!我正在寻找一种方法来根据我的应用程序生成的url动态地切换模型中的网址。我检查的答案对我来说效果很好。 – Vikram 2012-07-30 17:34:55
您可以设置URL作为取功能选项,如:
var mod = new MyModel();
mod.fetch({
url: '/some/other/url',
data: {}
});
你为什么要更改URL? REST风格的web服务背后的想法是,您的对象始终可用于相同的URL(具有特定对象所需的ID) – tkone 2012-07-27 19:29:14