从URL问题获取模型

时间:2014-07-09 16:09:09

标签: javascript jquery backbone.js

我有一个骨干js应用程序,其路由器看起来像:

var StoreRouter = Backbone.Router.extend({
   routes: {
      'stores/edit/:id': 'edit'
   },
   edit: function(id){
      var store = new Store({id: id});
      store.fetch({success: function(){
          var editStoresView = new EditStoresView({
                el: ".wrapper",
                model: store
          });
      }});
   }
});
var storeRouter = new StoreRouter();
Backbone.history.start({ pushState: true, hashChange: false });

我的模型看起来像:

var Store = Backbone.Model.extend({
   urlRoot: function(){
      if (this.isNew()){
          return "/stores";
      } else {
          return "/stores/" + this.id;
      }
   }
});

在Chrome的JS控制台中,当它应该向 / stores / ID_HERE / stores 网址的GET请求>

2 个答案:

答案 0 :(得分:1)

Backbone uses a model's id field to determine if it's new or not,当你构建它时,你正在传递它。

你可以跳过一些箍来编辑延迟加载模型 - 也就是说,在尝试编辑时只有fetch - 但它可能更容易改变你的urlRoot属性一个简单的" / stores /"。骨干will use that urlRoot property, along with the model's ID, to construct the URL。这是有道理的;如果你有一个id为3的Store模型,那么你想要点击" / stores / 3"加载它无论它的新的'状态。

如果您怀疑应用可能构建了没有ID的Store,您可能希望将Store的{​​{1}}功能覆盖为如果在没有ID的模型上调用异常,则抛出异常。

答案 1 :(得分:0)

是的,它有意义,Model.IsNew()用于检查模型是否具有id属性(请参阅此处,http://backbonejs.org/#Model-isNew)。这种方式骨干知道何时执行保存或放入服务器。

要使用ID从服务器获取数据,您需要:

var store = new Store({id: id}); // Ok here we're setting an id on our model.

var Store = Backbone.Model.extend({
    urlRoot: function(){
       return "/stores/"
    }

    GetData : function (){
        this.fetch()
    }  

});

如果您的模型具有任何属性,则在执行提取时,所有属性都将发送到服务器。

因此,您的网址必须相同,但如果您的模型具有Id属性,则网址将类似于' stores / 1'。如果不是,只会'商店/'

在你的API中,你需要有两个方法,一个期望一个(int)参数,另一个期望什么都没有。

希望它有所帮助。