我目前在一个集合中为这样的用户获取一个项目:
me.user = Backbone.Collection.Users.collection().get(id);
这将返回应用程序中所需的默认属性集。在用户个人资料页面上,我想显示其他地方不需要的其他属性。
如何使用我可以指定的其他属性获取集合(查询服务器)中的项目?
由于
答案 0 :(得分: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()
功能在发送名称和电子邮件属性之前提取额外数据并执行某些操作到模型集方法。
虽然,最近我认为我读到使用解析来处理额外数据的东西是不好的形式。 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);
}
您可以为真正独特的用户执行类似操作,例如使用您应用的主要用户。当我为我的应用程序(代表用户自己的用户模型)实例化用户模型时,我还初始化了一些其他特殊模型,只有用户可以拥有(比如用于获取身份验证数据的auth模型等)。
我不确定我是否按下了你的要求,但我希望我能碰到一些东西。
答案 1 :(得分:0)
集合已经是一个实例,我假设了吗?如果是这样,你应该这样做:
me.user = Backbone.Collection.Users.collection.get(id);
即。收集后删除括号()。