没有提取正确的网址问题

时间:2014-07-09 20:29:44

标签: javascript jquery backbone.js model underscore.js

我有一个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/

1 个答案:

答案 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自动化的强大功能。 (我认为同步从这里接过来,不要引用我的话。)

参考:Backbone annotated sourcecode