【问题标题】:How to get an item in a collection with extra attributes如何获取具有额外属性的集合中的项目
【发布时间】:2012-08-21 22:50:56
【问题描述】:

我目前在集合中为这样的用户获取一个项目:

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

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

如何在集合(查询服务器)中获取具有我可以指定的附加属性的项目?

谢谢

【问题讨论】:

  • 我在想他的意思是类似于具有属性nameemail 的通用用户模型,但是一个用户模型可能附加了一个附加对象,例如身份验证模型,以表示它是用户用户。

标签: collections backbone.js backbone-views


【解决方案1】:

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

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

假设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() 函数提取额外数据并在将名称和电子邮件属性发送到模型设置方法。

虽然,最近我认为我读到使用解析来处理额外数据是不好的形式。 Override set 因此,您可能只想将其保存为命名空间,然后在覆盖的 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);
}

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

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

【讨论】:

    【解决方案2】:

    collection 已经是一个实例了吗,我假设是这样吗?如果是这样,你应该只做:

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

    即收集后去掉括号()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多