我有一个 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/"
});
然后我的 View 看起来像:
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 中,这是它要访问的 url:
GET http://localhost/stores/
最佳答案
这可能不是答案,因为它取决于您的实际生产代码。
通常您输入的代码应该可以工作,我什至看到一条评论说它可以在 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();
生成 URL 的函数。当您声明商店模型与数据库中的模型相似时,您添加了自定义
idAttribute
。例如你的数据库有一个不同于id
本身的 id,但是在你的代码中你仍然使用new Model({ id: id });
当你真的应该使用新模型({ customId: id });
。在幕后发生的事情是您在url()
函数中看到它检查模型是否isNew()
。此函数实际上检查是否设置了id
,但如果它是自定义的,它会检查: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 自动化的强大功能。 (我认为同步从这里接管,不要引用我的话)。
关于javascript - 没有获取正确的 url 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663251/