2016-11-05 2 views
1

Mit etwas Spaß mit Backbone-relational.js v0.10.0Backbone Relational - Deep verschachtelte Modelle/Kollektionen

Ich habe ein JSON-Objekt, das verschachtelte Modelle und Sammlungen enthält, diese einfach zu halten ich das Beispiel unten gemacht haben. Ein Unternehmen kann viele Mitarbeiter haben, Mitarbeiter können eine Adresse und viele Aufgaben haben.

{ 
    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' 
     }] 
    }] 
} 

in der unten JSFiddle (Konsole) man kann sehen, dass die Adresse eine einfache Aufgabe ist, auch der auf Kommentar-Code für Aufgaben hat als tasks wird als Array zurück deaktiviert wurde.

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

Weder das Adress-Modell oder die Sammlung von Aufgaben als Backbone-Instanzen erstellt werden, ist dies möglich, oder bin ich die Grenzen dieses Plugin schieben?

+0

Das ist etwas, das mich zu frustriert hat, in der Tat ein Problem in Core-Backbone ist es, so viele Sammelfunktion Anrufe werden eine Reihe von Modellen zurückkehren anstelle eines anderen Sammelobjekts, das Verkettung ermöglichen und Ausführlichkeit vermeiden würde. Was Sie suchen, können Sie mit https://github.com/mikeapr4/Backbone.hierarchy oder https://github.com/blittle/backbone-nested-models – mikeapr4

+1

@ mikeapr4 erreichen - es funktioniert mit dem traditionellen relationalen Backbone, er vermisste die reverseRelation, die die Submodelle wieder an das Model bindet. Überprüfen Sie die Antwort unten. Es gibt auch ein funktionierendes Beispiel für die Dokumentation => http://backbonerelational.org/#examples –

Antwort

1
  • Hier ist, wie ich das Problem gelöst habe. Sie vermissten die reverseRelation.
  • BTW hast du dir das post angesehen? Es hat ein ähnliches Problem.

Folgen Sie der 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

Bitte vermeiden Sie Code-Snippets, wenn es nicht ausgeführt werden kann. –

+0

Danke. Ich habe das Snippet runnable gemacht. Auch gibt es einen Link zur Geige –

+0

Großartig! Ein Link zu einer Geige ist in Ordnung, wenn er nicht in einem ausführbaren Snippet enthalten sein kann. Es muss jedoch mindestens das entsprechende Codebeispiel beigefügt sein. Aber jetzt ist es überflüssig, da Sie das Snippet ausführbar gemacht haben. –