javascript – 与Backbone-Relational实现多对多关系

前端之家收集整理的这篇文章主要介绍了javascript – 与Backbone-Relational实现多对多关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的应用程序,它定义了两个类,一个Person和一个PersonGroup,其中有一个多对多的关系.一个人可以没有组,也不能分配给所有组,以及介于两者之间的任何组.

backbonerelational.org上的示例建议使用中间模型来实现多对多关系,但是我无法使用此模式来获取(反序列化)和保存(序列化).

我想要做的是使用Backbone反序列化类似于以下内容JSON

  1. {
  2. People:
  3. [
  4. {
  5. "ID": 1,"Name": "John"
  6. },{
  7. "ID": 2,"Name": "Bob"
  8. },{
  9. "ID": 3,"Name": "Tim"
  10. },],PeopleGroups:
  11. [
  12. {
  13. "ID": 1,"Name": "Owners","People":
  14. [
  15. 1,2
  16. ],},"Name": "Everyone",2,3
  17. ],]
  18. }

我正在使用Knockback / Knockout进行数据绑定,因此问题是我需要能够通过引用访问关系.除非我能创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用,否则ID数组对我没有任何帮助.

解决方法

我最终以我想要的方式工作.多对多关系在数据库中维护,但只能在我的Backbone模型中以一个方向访问关系.我决定Person模型是独立的,PersonGroup模型会有一组对它们链接到的Person模型的引用.

这里使一切工作的关键点是指定includeInJSON:“ID”并删除reverseRelation.这仍然允许您在JavaScript中访问模型的引用,但它正确地序列化和反序列化为JSON. Person模型根本无法访问它们所在的组的导航属性,但是它们可以存在于多个组中.

我只是假设使用ID列表会强制跳过箍来解析引用,但Backbone-relational似乎使用全局Backbone模型存储来解析ID引用而不创建重复模型. (例如,三个不同的组可以引用同一个人,并且只创建一个模型).

  1. var Person = Backbone.RelationalModel.extend(
  2. {
  3. idAttribute: "ID",});
  4.  
  5. var PersonGroup = Backbone.RelationalModel.extend(
  6. {
  7. idAttribute: "ID",relations:
  8. [
  9. {
  10. type: Backbone.HasMany,key: "People",relatedModel: "Person",collectionType: "PersonCollection",includeInJSON: "ID",});

如果它可以帮助任何人,那么这是管道的其余部分.您可以按如下方式定义Backbone.Collections并通过单独的API请求获取它们:

  1. var PersonCollection = Backbone.Collection.extend(
  2. {
  3. model: Person,url: "/api/person",});
  4.  
  5. var PersonGroupCollection = Backbone.Collection.extend(
  6. {
  7. model: PersonGroup,url: "/api/persongroup",});
  8.  
  9. var PersonModels = new PersonCollection();
  10.  
  11. var GroupsModels = new PersonGroupCollection();
  12.  
  13. this.PersonModels.fetch();
  14.  
  15. this.GroupsModels.fetch();
  16.  
  17. this.People = kb.collectionObservable(
  18. this.PersonModels,{
  19. factories:
  20. {
  21. "models": Personviewmodel,}
  22. );
  23.  
  24. this.PersonGroups = kb.collectionObservable(
  25. this.GroupsModels,{
  26. factories:
  27. {
  28. "models": PersonGroupviewmodel,"models.People.models": Personviewmodel,}
  29. );

我包含了使用Knockout.js绑定的Knockback.js特定集合.每个模型只创建一个viewmodel,因此更改跟踪将在整个应用程序中传播.

猜你在找的JavaScript相关文章