如何在视图中使用视图中定义的动态URL获取模型

时间:2014-11-27 06:49:25

标签: backbone.js backbone-views backbone-collections

我在我的应用中使用backbone.js。我的名为MyModel的模型是

Backbone.Model.extend({
    urlRoot: 'home'
  });

需要使用网址获取模型" home / abc / xyz"在哪里" abc"和" xyz"在我看来是动态的。我做了以下

var model = new MyModel({id:'abc/xyz'});
    model.fetch();

但它不起作用。 它转到url" home / abc?xyz"。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是Backbone.Model的url函数,它负责Backbone中的这种行为:

url: function() {
  var base =
    _.result(this, 'urlRoot') ||
    _.result(this.collection, 'url') ||
    urlError();
  if (this.isNew()) return base;
  return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
}

正如您所看到的,encodeURIComponent(this.id)将对您的ID进行编码,因此您无法通过和'/' - > '%2F'。 你总是可以重写这个功能,但我想这不是最好的主意,因为它可以打破另一个东西。

我可以建议你另一种方法:

只需将模型的urlRoot定义为功能,然后完成工作:

var yourModel = Backbone.Model.extend({
    defaultUrl: 'home',
    urlRoot: function () {
        return defaultUrl + this.get('yourUrlAttribute');
    }
});

在创建时,只需将yourUrlAttribute作为模型属性传递并获取模型。

考虑到这种方法,Backbone.Model将附加编码的“id”作为URL的最后一部分(当你获取模型时),你可以得到你想要的。