骨干搜索多个模型

Backbone search multiple-models

本文关键字:模型 搜索      更新时间:2023-09-26

我最近一直在尝试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 处理这个问题?

正如我看到您的 JSON 没有返回 3 个不同的模型,而是返回 3 个不同的集合,因为它们中的 3 个包含数组。

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

[
  {
    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

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非常重要。