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)
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)
现在当你save或fetchBackbone知道这是如何工作的.
所以就像你正在制作一个新模型:
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会.为新数据创建新模型.