我最近一直在尝试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>
答案 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非常重要。