2012-08-16 33 views
11

Có ai sử dụng dữ liệu ember để mô hình hóa một cây dữ liệu không?Ember-Data đệ quy hasMany hiệp hội

tôi sẽ giả định nó sẽ là một cái gì đó như:

Node = DS.Model.extend({ 
    children: DS.hasMany(Node), 
    parent: DS.belongsTo(Node) 
}); 

Tuy nhiên, tôi đã không thể để làm việc này mà dẫn được để tin rằng một trong hai: 1) Tôi chỉ đơn giản sai trong cách tôi 'm thiết lập điều này hoặc, 2) hiện tại không thể mô hình hóa cây bằng cách sử dụng dữ liệu ember.

Tôi hy vọng rằng đó là cựu và không phải là thứ hai ...

Tất nhiên nó có thể là JSON ... Tôi giả JSON nên có dạng:

{ 
    nodes: [ 
     { id: 1, children_ids: [2,3], parent_id: null }, 
     { id: 2, children_ids: [], parent_id: 1 }, 
     { id: 3, children_ids: [], parent_id: 1 } 
    ] 
} 

Mọi lời khuyên/lời khuyên cho vấn đề này sẽ được đánh giá cao.

+0

Điều gì không hoạt động chính xác? Bạn có thể vui lòng thêm một số mã vào câu hỏi của bạn để hiển thị cho chúng tôi sự cố không? –

+0

Chắc chắn, tôi đã thiết lập một ví dụ đơn giản [jsFiddle] (http://jsfiddle.net/heuristocrat/5aqHx/) cho thấy cách tôi tin rằng tôi nên xác định mô hình và sau đó thực hiện tìm kiếm nút gốc và cố truy cập những đứa trẻ (đó là nơi mà mọi thứ bị phá vỡ). – Heuristocrat

+0

Đó là một fiddle hữu ích. Tôi đã có vấn đề tương tự bản thân mình trong một hasMany không đệ quy, vì vậy tôi quan tâm đến việc nhìn thấy bất kỳ giải pháp. – pjmorse

Trả lời

14

Có một vài điều nhỏ nhặt mà ngăn chặn fiddle bạn để làm việc:

  • các DS.hasMany chức năng yêu cầu một String như là đối số. Đừng quên các dấu ngoặc kép: DS.hasMany('Node')

  • trong định nghĩa lịch thi đấu, hasMany các mối quan hệ không được đặt trước bởi _ids hoặc bất kỳ thứ gì. Chỉ cần sử dụng tên đơn giản. Ví dụ: { id: 42, children: [2,3], parent_id: 17 }

  • các length tài sản của DS.ManyArray nên được truy cập bằng cách sử dụng chức năng get: root.get('children.length')

  • theo mặc định, adapter vật cố mô phỏng một cuộc gọi ajax. Truy vấn find sẽ điền vào bản ghi sau khi đợi 50ms. Trong fiddle của bạn, cuộc gọi root.get('children.length') đến quá sớm.Bạn có thể cấu hình các bộ chuyển đổi cố định do đó nó làm cho cuộc gọi đồng bộ:

    App.store = DS.Store.create({ 
        revision: 4, 
        adapter: DS.FixtureAdapter.create({ 
         simulateRemoteResponse: false 
        }) 
    }); 
    

    Hoặc bạn có thể tải dữ liệu đến các cửa hàng mà không cần bất kỳ adapter:

    App.store.loadMany(App.Node, [ 
        { id: 1, children: [2, 3] }, 
        { id: 2, children: [], parent_id: 1 }, 
        { id: 3, children: [], parent_id: 1 } 
    ]); 
    
  • và mới nhất: nó có vẻ như ứng dụng Ember cần được khai báo trong phạm vi toàn cầu (không var), và các mô hình Ember dữ liệu cần được khai báo trong phạm vi ứng dụng (thay thế var Node = ... bởi App.Node = ...)

Full dụ:

App = Ember.Application.create(); 

App.store = DS.Store.create({ 
    revision: 4 
}); 

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node'), 
    parent:   DS.belongsTo('App.Node') 
}); 

App.store.loadMany(App.Node, [ 
    { id: 1, children: [2, 3] }, 
    { id: 2, children: [], parent_id: 1 }, 
    { id: 3, children: [], parent_id: 1 } 
]); 

var root = App.store.find(App.Node, 1); 

alert(root.get('children')); 
alert(root.get('children.length')); 
+0

giả định App.Node có thuộc tính "name", có thể lặp qua tất cả các trẻ em trong một mẫu như sau: {{#each child in controller.children}} {{child.name}} {{/ each}} ? – lipp

+0

Làm thế nào bạn sẽ xóa một Nút mà không gặp phải một đệ quy vô hạn? Tôi hiện đang đối mặt với vấn đề này. –

-3

Không chắc nhưng theo ví dụ được đưa ra trong ember dẫn

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('App.Comment') 
}); 

Các JSON nên mã hóa các mối quan hệ như một mảng của các ID:

{ 
    "post": { 
    "comment_ids": [1, 2, 3] 
    } 
} 
1

didn này 't làm việc cho tôi cho đến khi tôi thiết lập nghịch đảo:

App.Node = DS.Model.extend({ 
    children: DS.hasMany('App.Node', {inverse: 'parent'}), 
    parent: DS.belongsTo('App.Node', {inverse: 'children'}) }); 
+0

Nó dường như không hoạt động trong dữ liệu ember 1.0.0-beta.7 (phiên bản cuối cùng). Có ai đã giải quyết vấn đề này trong các phiên bản mới nhất không? – Gorzas

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