我有一个骨干js应用程序,其路由器看起来像:
var StoreRouter = Backbone.Router.extend({
routes: {
'stores/edit/:id': 'edit'
},
edit: function(id){
var store = new Store({id: id});
store.fetch({success: function(){
var editStoresView = new EditStoresView({
el: ".wrapper",
model: store
});
}});
}
});
var storeRouter = new StoreRouter();
Backbone.history.start({ pushState: true, hashChange: false });
我的模型看起来像:
var Store = Backbone.Model.extend({
urlRoot: function(){
if (this.isNew()){
return "/stores";
} else {
return "/stores/" + this.id;
}
}
});
在Chrome的JS控制台中,当它应该向 / stores / ID_HERE / stores 网址的GET请求>
答案 0 :(得分:1)
Backbone uses a model's id
field to determine if it's new or not,当你构建它时,你正在传递它。
你可以跳过一些箍来编辑延迟加载模型 - 也就是说,在尝试编辑时只有fetch
- 但它可能更容易改变你的urlRoot
属性一个简单的" / stores /"。骨干will use that urlRoot
property, along with the model's ID, to construct the URL。这是有道理的;如果你有一个id为3的Store
模型,那么你想要点击" / stores / 3"加载它无论它的新的'状态。
如果您怀疑应用可能构建了没有ID的Store
,您可能希望将Store
的{{1}}功能覆盖为如果在没有ID的模型上调用异常,则抛出异常。
答案 1 :(得分:0)
是的,它有意义,Model.IsNew()用于检查模型是否具有id属性(请参阅此处,http://backbonejs.org/#Model-isNew)。这种方式骨干知道何时执行保存或放入服务器。
要使用ID从服务器获取数据,您需要:
var store = new Store({id: id}); // Ok here we're setting an id on our model.
var Store = Backbone.Model.extend({
urlRoot: function(){
return "/stores/"
}
GetData : function (){
this.fetch()
}
});
如果您的模型具有任何属性,则在执行提取时,所有属性都将发送到服务器。
因此,您的网址必须相同,但如果您的模型具有Id属性,则网址将类似于' stores / 1'。如果不是,只会'商店/'
在你的API中,你需要有两个方法,一个期望一个(int)参数,另一个期望什么都没有。
希望它有所帮助。