0

我尝试使用来自 2 个不同的 Rest 服务的值生成一个主干集合。我得到了 1 个休息服务,它给了我一个包含一般属性的列表,例如:

{["id":"31", "folder":"fid3223"]}
{["id":"12", "folder":"fid2323"]}

我在一个集合中获取它们,现在我希望每个模型都能获得他的属性,我只能通过他的 id 从另一个休息资源中获得这些属性。我想像这样将它们保存在该集合中:

{["id":"31", "folder":"fid3223", propertys["prop1":"value1","prop2":"value2","prop3":"value3"]]}
{["id":"12", "folder":"fid2323",propertys["prop1":"value1","prop2":"value2","prop3":"value3"]]}

有没有一种简单的方法来使用骨干实现这一点?

4

2 回答 2

1

我认为您正在寻找合并您Model的 s 属性。

从服务器获取数据后,您可以执行以下操作:

var models = [ {..}, {..} ]; // Two javascript objects holding the attributes, let's assume these are from the second fetch
collection.set(models, { merge: true }); // Here Backbone will look for existing objects in that collection and merge their attributes

你如何获取数据是另一回事。
如果它使用fetch()Backbone 提供的方法,并且新属性在里面,propertys你应该覆盖集合的parse()方法......请参阅 Backbone 的文档。

于 2013-07-03T17:35:29.367 回答
0

首先,我认为从 Rest Service 1 获取的“模型”应该如下所示:

{"id":"31","folder":"fid3223"}
{"id":"32","folder":"fid2323"}

一个对象代表一个列表项对吗?

您的合并集合应如下所示:

[{"id":"31","folder":"fid3223","propertys":{"prop1":"value1","prop2":"value2","prop3":"value3"}}

您希望将这两个 Rest 服务数据合并到一个集合中。当您的数据设置了唯一的 id 属性时,主干提取方法将执行“智能”提取。因此,您可以将 Rest1 服务获取到集合中,然后将其 url 属性动态更改为 Rest2 url,然后再次获取。相同的 id 列表数据将被合并。

简单的例子:

模型:

var List = Backbone.Model.extend({

});

收藏:

var Lists = Backbone.Collection.extend({
    model: List,
    url:"ur/url/to/rest1"
});

var lists = new Lists();

查看:(checkItem 功能将帮助您查看您的收藏中的模型发生了什么)

var ListView = Backbone.View.extend({
    el: "#list-view",
    initialize: function(){
        this.listenTo(lists,"add",this.checkItem);
        this.listenTo(lists,"change",this.checkItem);
    },
    checkItem: function(model){
        console.dir(model);
});

var listView = new ListView();

$("#basic-btn").click(function(){
    lists.fetch();
});

$("#property-btn").click(function(){
    lists.url = "ur/url/to/rest2";
    lists.fetch();
});

HTML:

<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="js/jquery-1.8.2.js"></script>
<script type="text/javascript" src="js/jquery-easing-1.3.js"></script>
<script src="js/bootstrap.min.js"></script>
<!--backbone-->
<script type="text/javascript" src="js/backbone/underscore.js"></script>
<script type="text/javascript" src="js/backbone/backbone.js"></script>

<script type="text/javascript" src="js/test.js"></script>
</head>
<body>
<button id="basic-btn">load basic</button>
<button id="property-btn">load property</button>
<ul id="list-view">
</ul>
</body>
</html>

首先我点击“basic-btn”,会得到这样的结果:

在此处输入图像描述

然后我单击“property-btn”,属性将合并到现有列表项中:

在此处输入图像描述

希望这对你有帮助。

于 2013-07-03T17:52:44.760 回答