我有一个backboneJS应用程序,它有一个看起来像
的路由器var StoreRouter = Backbone.Router.extend({
routes: {
'stores/add/' : 'add',
'stores/edit/:id': 'edit'
},
add: function(){
var addStoresView = new AddStoresView({
el: ".wrapper"
});
},
edit: function(id){
var editStoresView = new EditStoresView({
el: ".wrapper",
model: new Store({ id: id })
});
}
});
var storeRouter = new StoreRouter();
Backbone.history.start({ pushState: true, hashChange: false });
和一个看起来像的模型:
var Store = Backbone.Model.extend({
urlRoot: "/stores/"
});
然后我的观点如下:
var EditStoresView = Backbone.View.extend({
...
render: function() {
this.model.fetch({
success : function(model, response, options) {
this.$el.append ( JST['tmpl/' + "edit"] (model.toJSON()) );
}
});
}
我认为提取时的urlRoot会调用 / stores / ID_HERE ,但是现在它没有调用它,它只是调用 / stores / ,但是我不确定为什么以及如何解决这个问题?
在devTools中,这是它的目标:
GET http://localhost/stores/
答案 0 :(得分:4)
这可能不是答案,因为它取决于您的实际生产代码。
通常情况下,您输入的代码应该有效,我甚至看到一条评论说它可以在jsfiddle中运行。有几个原因可能会影响结果:
在您的代码中,您更改了Backbone.Model.url()
功能。默认情况下,url函数是
url: function() {
var base =
_.result(this, 'urlRoot') ||
_.result(this.collection, 'url') ||
urlError();
if (this.isNew()) return base;
return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
},
这是Backbone用于生成model.fetch();
的网址的功能。
当您将商店模型声明为数据库中的商店模型时,您添加了自定义idAttribute
。例如,您的数据库具有与id
本身不同的ID,但在您的代码中,当您真正使用new Model({ id: id });
时仍然使用new Model({ customId: id });
。幕后发生的事情是,您在url()
函数中看到它检查模型isNew()
。此函数实际检查是否设置了id
,但如果它是自定义的,则检查:{/ p>
isNew: function() {
return !this.has(this.idAttribute);
},
你搞砸了Backbone.sync
......很多事情都可以做到这一点我甚至不会开始,除非我想写一篇论文。也许您在不知道它可能会影响其他代码的情况下遵循教程。
您致电model.fetch()
" a la" $ .ajax风格:
model.fetch({
data: objectHere,
url: yourUrlHere,
success: function () {},
error: function () {}
});
这超越了Backbone自动化的强大功能。 (我认为同步从这里接过来,不要引用我的话。)