【问题标题】:Not fetching correct url issue未获取正确的网址问题
【发布时间】:2014-07-09 20:29:44
【问题描述】:

我有一个主干JS 应用程序,它有一个看起来像的路由器

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 中,这是它要访问的 url:

GET http://localhost/stores/

【问题讨论】:

  • 您需要发布更多的来源,设置urlRoot 可能不是问题。
  • @Whymarrh,当然,哪些部分会有所帮助?剩下的视图代码?
  • @the_:问题不在于您在此处提供的代码 - 我尝试完成它并且正确生成了 URL。随意将console.log(id) 添加到StoreRouter.edit(),也许id 参数设置不正确。或者,您的应用程序中可能还有其他代码路径,而不是您在此处复制的路径。
  • @WladimirPalant,好的,我做了 console.log(id);在 StoreRouter.edit() 中,但它只是正确地返回了 id?
  • @WladimirPalant,我刚刚编辑并添加了我唯一的其他路线功能。

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


【解决方案1】:

这可能不是答案,因为它取决于您的实际生产代码。

通常你输入的代码应该可以工作,我什至看到一条评论说它可以在 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({ customId: id }); 时,您仍然使用 new Model({ id: 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 自动化的强大功能。 (我认为同步从这里接管,不要引用我的话)。

参考:Backbone annotated sourcecode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2013-10-22
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多