2013-07-23 41 views
6

Tôi có một ứng dụng đơn giản xác định hai lớp, một Person và một PersonGroup, trong đó có mối quan hệ nhiều-nhiều. Một người không thể có nhóm hoặc được chỉ định cho tất cả các nhóm và bất kỳ thứ gì ở giữa.Thực hiện mối quan hệ Nhiều-với-Nhiều với Backbone-Quan hệ

Ví dụ về backbonerelational.org gợi ý sử dụng mô hình ở giữa cho nhiều mối quan hệ, tuy nhiên tôi không thể làm mẫu này hoạt động với tìm nạp (deserializing) và lưu (serializing).

Những gì tôi muốn làm là sử dụng Backbone để deserialize một JSON tương tự như sau:

{ 
    People: 
    [ 
     { 
      "ID": 1, 
      "Name": "John" 
     }, 
     { 
      "ID": 2, 
      "Name": "Bob" 
     }, 
     { 
      "ID": 3, 
      "Name": "Tim" 
     }, 
    ], 
    PeopleGroups: 
    [ 
     { 
      "ID": 1, 
      "Name": "Owners", 
      "People": 
      [ 
       1, 
       2 
      ], 
     }, 
     { 
      "ID": 2, 
      "Name": "Everyone", 
      "People": 
      [ 
       1, 
       2, 
       3 
      ], 
     }, 
    ] 
} 

Tôi đang sử dụng Knockback/Knockout cho dữ liệu ràng buộc vì vậy vấn đề là tôi cần để có thể truy cập mối quan hệ bằng cách tham chiếu. Một mảng các ID không làm tôi tốt, trừ khi tôi có thể tạo một Knockback.CollectionObservable để bọc bộ sưu tập và giải quyết các ID để tham chiếu.

Trả lời

7

Tôi đã kết thúc việc này để hoạt động theo cách tôi muốn. Mối quan hệ Nhiều-Nhiều được duy trì trong cơ sở dữ liệu nhưng các mối quan hệ chỉ có thể được truy cập trong các mô hình Backbone của tôi theo một hướng. Tôi quyết định rằng các mô hình Person sẽ độc lập và các mô hình PersonGroup sẽ có một tập hợp các tham chiếu đến các mô hình Person mà chúng được liên kết tới.

Các điểm chính ở đây khiến mọi thứ hoạt động được chỉ định includeInJSON: "ID" và để xóa reverseRelation. Điều này vẫn cho phép bạn truy cập các tham chiếu đến các mô hình bằng JavaScript, nhưng nó sẽ tuần tự hóa và deserializes thành JSON một cách chính xác. Các mô hình Người chỉ đơn giản là không có quyền truy cập vào thuộc tính điều hướng đến Nhóm mà họ đang ở, tuy nhiên họ có thể tồn tại trong nhiều nhóm tốt. Tôi chỉ đơn giản giả định rằng việc sử dụng một danh sách các ID sẽ ủy nhiệm nhảy qua các vòng để giải quyết các tham chiếu, nhưng Backbone-relational dường như sử dụng cửa hàng mô hình Backbone toàn cầu để giải quyết các tham chiếu bằng ID mà không tạo các mô hình trùng lặp. (ví dụ: Ba nhóm khác nhau có thể tham chiếu cùng một Người và chỉ có một mô hình được tạo ra).

var Person = Backbone.RelationalModel.extend(
{ 
    idAttribute: "ID", 
}); 

var PersonGroup = Backbone.RelationalModel.extend(
{ 
    idAttribute: "ID", 

    relations: 
    [ 
     { 
      type: Backbone.HasMany, 
      key: "People", 
      relatedModel: "Person", 
      collectionType: "PersonCollection", 
      includeInJSON: "ID", 
     }, 
    ], 
}); 

Và đây là phần còn lại của hệ thống ống nước nếu nó giúp anyone.You có thể xác định Backbone.Collections như sau và có được chúng thông qua yêu cầu API riêng biệt:

var PersonCollection = Backbone.Collection.extend(
{ 
    model: Person, 

    url: "/api/person", 
}); 

var PersonGroupCollection = Backbone.Collection.extend(
{ 
    model: PersonGroup, 

    url: "/api/persongroup", 
}); 

var PersonModels = new PersonCollection(); 

var GroupsModels = new PersonGroupCollection(); 

this.PersonModels.fetch(); 

this.GroupsModels.fetch(); 

this.People = kb.collectionObservable(
    this.PersonModels, 
    { 
     factories: 
     { 
      "models": PersonViewModel, 
     }, 
    } 
); 

this.PersonGroups = kb.collectionObservable(
    this.GroupsModels, 
    { 
     factories: 
     { 
      "models": PersonGroupViewModel, 
      "models.People.models": PersonViewModel, 
     }, 
    } 
); 

tôi bao gồm các cụ Knockback.js bộ sưu tập để sử dụng các ràng buộc Knockout.js. Chỉ có một ViewModel được tạo cho mỗi mô hình để theo dõi thay đổi được truyền bá thông qua toàn bộ ứng dụng.

3

Câu hỏi này khoảng hai tháng tuổi, tuy nhiên tôi muốn chia sẻ rằng tôi đã gặp phải các vấn đề tương tự liên quan đến nhiều mối quan hệ khi làm việc với Backbone-relational. Những vấn đề này dẫn đến việc viết một thực hiện riêng của quan hệ Backbone hỗ trợ các mối quan hệ nhiều-nhiều mà không có một mô hình liên kết ở giữa: Backbone-JJRelational

Tôi trả lời là một trong các tác giả, nhưng có thể đáng để kiểm tra ngoài.
Các JSON bạn được đăng trong câu hỏi của bạn, ví dụ, sẽ tự động được deserialized theo cách sau:
Mỗi PeopleGroups -Người có một thuộc tính People mà là một Backbone.Collection chứa People -models thích hợp và (tất nhiên) ngược -versa, vì vậy mối quan hệ có thể dễ dàng truy cập từ cả hai phía (không có mô hình liên kết).
Một số khái niệm về Backbone-JJRelational tương tự như Backbone-relational (cửa hàng mô hình toàn cầu, chẳng hạn).

Các vấn đề liên quan