2016-11-05 87 views
1

有一些有趣的骨干,relational.js v0.10.0骨干关系 - 深嵌套模型/收藏

我有一个包含嵌套模型和集合JSON对象,让这个简单的我做了下面的例子。一个公司可以有很多员工,员工可以有一个地址和许多任务。

{ 
    name: 'Nicks Company', 
    employees: [{ 
     name: 'Bob', 
     address: { 
      line1: '1 City Lane', 
      city: 'London' 
     }, 
     tasks: [{ 
      description: 'Make this work' 
     }] 
    }, { 
     name: 'Bill', 
     address: { 
      line1: '1 The Street', 
      city: 'Birmingham' 
     }, 
     tasks: [{ 
      description: 'Make a cake' 
     }, { 
      description: 'Fix all the things' 
     }] 
    }] 
} 

在下面的jsfiddle(控制台)可以看出,该地址是一个普通的对象,也可用于任务的注释代码已被停用tasks返回为阵列。

的jsfiddle:https://jsfiddle.net/nwa29uLv/2/

无论是地址模型或创建为骨干实例任务的集合,这是可能的还是我推这个插件的限制?

+0

这是东西已经挫败了我太多,实际上它的核心骨干的一个问题,因为很多集合函数调用返回的车型阵列而不是另一个集合对象,这将允许链接和避免冗长。使用https://github.com/mikeapr4/Backbone.hierarchy或https://github.com/blittle/backbone-nested-models – mikeapr4

+1

@ mikeapr4可以实现您寻找的内容 - 它可以与传统的关系骨干一起使用,他错过了将子模型连接到模型的reverseRelation。检查下面的答案。在文档上也有一个工作示例=> http://backbonerelational.org/#examples –

回答

1
  • 下面是我如何解决这个问题。您错过了 reverseRelation
  • 顺便说一声你看这post?它有一个类似的问题。

按照fiddle here

var Address = Backbone.RelationalModel.extend({}); 
 

 
var Task = Backbone.RelationalModel.extend({}); 
 
var TaskCollection = Backbone.Collection.extend({ 
 
    model: Task 
 
}); 
 

 
var Employee = Backbone.RelationalModel.extend({ 
 
    relations: [{ 
 
    type: Backbone.HasOne, 
 
    key: 'address', 
 
    relatedModel: Address, 
 
    reverseRelation: { 
 
     type: Backbone.HasOne, 
 
     key: 'employee' 
 
    } 
 
    }, { 
 
    type: Backbone.HasMany, 
 
    key: 'tasks', 
 
    collectionType: TaskCollection, 
 
    relatedModel: Task, 
 
    reverseRelation: { 
 
     type: Backbone.HasOne, 
 
     key: 'operatesOn' 
 
    } 
 
    }] 
 
}); 
 

 
var EmployeeCollection = Backbone.Collection.extend({ 
 
    model: Employee 
 
}); 
 

 
var Company = Backbone.RelationalModel.extend({ 
 
    relations: [{ 
 
    type: Backbone.HasMany, 
 
    key: 'employees', 
 
    relatedModel: Employee, 
 
    reverseRelation: { 
 
     key: 'worksFor' 
 
    } 
 
    }] 
 
}); 
 

 
var company = new Company({ 
 
    name: 'Nicks Company', 
 
    employees: [{ 
 
    name: 'Bob', 
 
    address: { 
 
     line1: '1 City Lane', 
 
     city: 'London' 
 
    }, 
 
    tasks: [{ 
 
     description: 'Make this work' 
 
    }] 
 
    }, { 
 
    name: 'Bill', 
 
    address: { 
 
     line1: '1 The Street', 
 
     city: 'Birmingham' 
 
    }, 
 
    tasks: [{ 
 
     description: 'Make a cake' 
 
    }, { 
 
     description: 'Fix all the things' 
 
    }] 
 
    }] 
 
}); 
 

 
console.log('Company:', company.get('name')); 
 
company.get('employees').each(function(employee) { 
 
    console.log('Employee:', employee.get('name')); 
 
    console.log('Employee:', employee.get('name'), 'Address Model:', employee.get('address').get('city')); 
 
    employee.get('tasks').each(function(task) { 
 
    console.log('Employee:', employee.get('name'), 'Task: ', task.get('description')); 
 
    }); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone-relational/0.10.0/backbone-relational.js"></script>

+0

请避免代码片段,如果它不能运行。 –

+0

谢谢。我已经制作了可运行的代码段。还有一个链接到小提琴 –

+0

太棒了!如果它不能在可运行的代码片段中,则指向小提琴的链接很好。但它必须至少附带相关的代码示例。但是,现在,这是多余的,因为你使得片段可以运行。 –