2016-11-05 88 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

太棒了!如果它不能在可運行的代碼片段中,則指向小提琴的鏈接很好。但它必須至少附帶相關的代碼示例。但是,現在,這是多餘的,因爲你使得片段可以運行。 –