javascript – 嵌套在firebase集合模型中的集合没有添加功能
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 嵌套在firebase集合模型中的集合没有添加功能,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4546字,纯文字阅读大概需要7分钟。
内容图文
在我的应用程序中,我正在尝试使用Firebase来存储基于骨干框架的实时数据.
问题是这样的:
我有一个子级模型和集合,它们都是通用骨干模型和集合.
var Todo = Backbone.Model.extend({
defaults: {
title: "New Todo",
completed : true
}
});
var Todocollection = Backbone.Collection.extend({
model: Todo,
initialize: function() {
console.log("creating a todo collection...");
},
});
然后有一个高级模型,它包含作为属性的次级集合.
var Daymodel = Backbone.Model.extend({
defaults : {
day: 1,
agenda : new Todocollection()
}
});
然后对于更高级别的集合,我将firebase集合
var DayCollection = Backbone.Firebase.Collection.extend({
model: Daymodel
});
到目前为止,我可以正确地将数据添加到更高级别的集合,它具有day属性和agenda属性(应该是TodoCollection).
问题是当我尝试将数据添加到子级别集合时,它无法正常工作.
this.collection.last()
.get("agenda")
.add({
title: this.input.val(),
completed: false
});
上面的代码将在View部分中.而this.collection.last()将获得最后一个模型. get(“agenda”)应该是集合对象.
但它无法奏效.错误显示this.collection.last(…).get(…).add不是函数.
调试后我发现this.collection.last().get(“agenda”)返回一个通用的JS对象而不是集合对象.
我进一步调试了如果我使用骨干集合作为外部集合DayCollection.一切都很顺利.
怎么解决这个问题?
解决方法:
为什么默认集合属性不再是集合?
当你获取或创建一个新的Daymodel,我假设看起来像这样:
{
day: 1,
agenda : [{
title: "New Todo",
completed : false
}, {
title: "other Todo",
completed : false
}]
}
首先是Todocollection的默认议程属性被原始对象数组取代. Backbone不知道议程是一个集合,不会自动填充它.
这就是Backbone对defaults at model creation (line 401)所做的事情:
06001
_.extend({},defaults,attrs)将默认值放在第一位,但随后,它们被传递的attrs覆盖.
如何在模型中使用集合?
以下是实现此目的的三种解决方案.只使用其中一个,或根据以下内容创建自己的.
最简单,最有效的方法是不要.
保持Todocollection不在Daymodel模型中,只在需要时创建集合,就像在假设的DayView中一样:
var DayView = Backbone.View.extend({
initialize: function() {
// create the collection in the view directly
this.agenda = new Todocollection(this.model.get('agenda'));
},
/* ...snip... */
});
然后,当您想要在模型中保留更改时,只需将集合模型放回Daymodel:
this.model.set('agenda', this.collection.toJSON());
将集合放入模型的属性中
您可以创建一个懒惰地创建集合并将其作为属性保留在模型中的函数,而不是属性,从而使属性hash保持干净.
var Daymodel = Backbone.Model.extend({
defaults: { day: 1, },
getAgenda: function() {
if (!this.agenda) this.agenda = new Todocollection(this.get('agenda'));
return this.agenda;
}
});
然后,模型控制集合,并且可以与已共享模型的所有内容轻松共享,每个实例仅创建一个集合.
保存模型时,仍需要将原始模型传递回属性哈希.
属性内的集合
您可以通过小改动完成您已经尝试做的事情.
>切勿将对象置于默认值中
…而不使用返回对象的函数.
var Daymodel = Backbone.Model.extend({
defaults: function() {
return {
day: 1,
agenda: new Todocollection()
};
},
});
否则,议程集合将在Daymodel的每个实例之间共享,因为在创建Daymodel类时仅创建一次集合.
这也适用于对象文字,数组,函数(为什么你还要把它放在默认值中?!).
>确保它始终是一个集合.
var Daymodel = Backbone.Model.extend({
defaults: { day: 1, },
initialize: function(attrs, options) {
var agenda = this.getAgenda();
if (!(agenda instanceof Todocollection)) {
// you probably don't want a 'change' event here, so silent it is.
return this.set('agenda', new Todocollection(agenda), { silent: true });
}
},
/**
* Parse can overwrite attributes, so you must ensure it's a collection
* here as well.
*/
parse: function(response) {
if (_.has(response, 'agenda')) {
response.agenda = new Todocollection(response.agenda);
}
return response;
},
getAgenda: function() {
return this.get('agenda');
},
setAgenda: function(models, options) {
return this.getAgenda().set(models, options);
},
});
>确保它是可序列化的.
var Daymodel = Backbone.Model.extend({
/* ...snip... */
toJSON: function(options) {
var attrs = Daymodel.__super__.toJSON.apply(this, arguments),
agenda = attrs.agenda;
if (agenda) {
attrs.agenda = agenda.toJSON(options);
}
return attrs;
},
});
如果您将集合放在模型属性中,这可以很容易地应用,如上所述.
>避免意外覆盖议程属性.
这与第2点并列,因为它很容易被忽视,或者其他人(或其他lib)可以做到这一点.
可以覆盖保存和设置功能来添加检查,但从长远来看,它变得过于复杂而没有太多的好处.
模特中收藏的缺点是什么?
我谈到完全避免在模型中使用它,或者懒洋洋地创建它.那是因为如果你实例化很多模型会变得非常慢,如果每个模型都嵌套多次会很慢(模型有一组模型,有其他模型集合等).
在按需创建时,您只需在需要时使用机器资源,并且仅在需要时使用.例如,现在不在屏幕上的任何模型都不会创建它们的集合.
开箱即用的解决方案
也许让这项工作正常工作太多了,所以一个完整的解决方案可能会有所帮助,而且还有一些.
> Backbone relational
> backbone-nested
> backbone-nested-models
> backbone-deep-model
内容总结
以上是互联网集市为您收集整理的javascript – 嵌套在firebase集合模型中的集合没有添加功能全部内容,希望文章能够帮你解决javascript – 嵌套在firebase集合模型中的集合没有添加功能所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。