0

我目前在集合中为用户获取一个项目,如下所示:

me.user = Backbone.Collection.Users.collection().get(id);

这将返回应用程序所需的默认属性集。在用户个人资料页面上,我想显示其他任何地方都不需要的其他属性。

如何使用我可以指定的其他属性获取集合(查询服务器)中的项目?

谢谢

4

2 回答 2

0

集合是否已经是一个实例,我假设是这样?如果是这样,你应该只做:

me.user = Backbone.Collection.Users.collection.get(id);

即收集后删除括号()。

于 2012-08-22T07:35:33.523 回答
0

因此,根据评论,我认为您想要的是生成额外的模型,而不是创建两个用户模型,一个具有冗余 + 额外数据。

你可以做到这一点的一种方法是给出不同模型之间的关系。

假设user模型仅包含名称和电子邮件。这很好,但您还想在页面上呈现用户配置文件(或您想要的任何“额外”。)这似乎是创建一个代表您想要的额外数据的单独模型的好机会。

你可以通过几种方式做到这一点。例如,如果每个用户都有一个配置文件,您可以将其烘焙到您的用户模型中。比如当你创建一个用户模型时:

user.profile = new Profile();  // model

我见过一些人将其他模型放入模型的属性中user.set('profile', new Profile()),但我不确定这是否是个好主意。我喜欢将我的模型属性与该模型隔离。

每个配置文件模型都有一个对应于 model.id 的 url。

因此,您可以只使用 user.profile.fetch() 并使用该配置文件属性来填充视图中的数据。也许它会做类似 /user/1/profile 的事情

关于您的问题,我认为您可能会提到的另一个方面是在您获取集合时一次性从服务器发送数据。也许您的服务器会回复如下数据:

[{"name":"Jake", "email":"j@stack.com", "profile":"{"aboutme":"Some story"}"}, ... ]

并且配置文件数据仅适用于拥有它的人等。在这种情况下,您可以使用该parse()功能提取额外的数据并在将名称和电子邮件属性发送到模型集方法之前做一些事情。

虽然,最近我认为我读到使用解析来处理额外数据是不好的形式。覆盖集因此,您可能只想将其保存为命名空间,然后在覆盖的 set 方法中执行以下操作,而不是解析:

set: function(attributes, options) {

    if (!_.isUndefined(this.profile) && attributes.profile) {
        this.profile = new Profile();
        this.profile.set(attributes.profile);
    } else if (attributes.profile) {
        this.profile.set(attributes.profile);
    }

    delete attributes.profile;

    return Backbone.Model.prototype.set.call(this, attributes, options);
}

您可以为真正独特的用户(例如使用您的应用程序的主要用户)做类似的事情。当我为我的应用程序(代表用户他/她自己的用户模型)实例化一个用户模型时,我还初始化了一些其他只有用户才会拥有的特殊模型(例如用于获取身份验证数据的身份验证模型等)

我不确定我是否击中了你的要求,但我希望我击中了一些东西。

于 2012-08-22T07:16:08.050 回答