骨干搜索多模型

时间:2012-08-14 14:39:33

标签: javascript search backbone.js

我最近一直在尝试Backbone并提出一个非常基本的问题。

我需要搜索不同类型的记录,搜索API会返回类似

的JSON响应
{ foo: 
  [
      { name: 'foo1', url: '/foo1' },
      { name: 'foo2', url: '/foo2' }
  ],
  bar:
  [ { name: 'bar1', url: '/bar1' } ],
  baz:
  [ { name: 'baz1', url: '/baz1' } ]
}

我有Foo,Bar和Baz的骨干模型。获取的集合应该打到我的服务器并获取搜索结果。我试过像

这样的东西
window.searchEntities = Backbone.Collection.extend({
  url: '/get_search_results'

  model: function(attrs, options) {
    //Typecast the JSON to Foo, Bar and Baz Models
  });      
});

但是,我不知道如何解析服务器返回的结果,以便我的集合包含模型Foo,Bar和Baz?或者我应该调整服务器返回的结果,以便使用Backbone更容易处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

因为我看到你的JSON没有返回3个不同的模型而是3个不同的Collection,因为其中3个包含Arrays。

我认为你应该从头开始,如果我理解你想要返回一堆不同类型的模型,那就说:

[
  {
    type: "Foo",
    name: "foo1",
    url: "/foo1"
  },

  {
    type: "Foo",
    name: "foo2",
    url: "/foo2"
  },

  {
    type: "Bar",
    name: "bar1",
    url: "/bar1"
  },

  {
    type: "Baz",
    name: "baz1",
    url: "/baz1"
  },
]

我在那里看到了一个集合,还有不同类型的不同模型。

现在让我们看一下SearchCollection,我认为你不能像你在你的例子中看到的那样使用model属性,所以让我们说所有模型都有一个共同的模型父Result:< / p>

window.SearchEntities = Backbone.Collection.extend({
  url: '/get_search_results'

  model: Result  
});

从这里我们可以做到这一点,如果没有真正的需要,不要创建Result的子类:

window.Result = Backbone.Model.extend({
  initialize: function(){
    this.url = this.get( "url" );
  }
});

你已经完成了:

var searchEntities = new window.SearchEntities();
searchEntities.fetch();

// ... wait for the fetch ends

searchEntities.at(0).get( "type" ); //=> "Foo"

我仍然感到不舒服有两个原因:

  • 我不清楚为什么要使用Result.url
  • 您的模型的ids在哪里?这对Backbone非常重要。