2013-10-24 16 views
5

Tôi đã đấu tranh để hiểu làm thế nào để sử dụng hasMany và thuộc về cho đôi khi khá. Sự hiểu biết của tôi là hasMany là mối quan hệ 1: nhiều và thuộcTo là một mối quan hệ nhiều: 1 - sang một bên: Vậy điều đó có nghĩa là nếu bạn có mối quan hệ hasMany, thì thuộc tính là cần thiết trong mô hình con của nó? Tôi đã đọc một số bài viết về nó:ExtJS 4: Hiểu hasMany và thuộc về

Vẫn còn một chút bối rối mặc dù. Hãy nói rằng tôi có các dữ liệu sau:

var data = { 
    "config": { 
    "name": "blah", 
    "id": 1, 
    "someconfig": [{ 
     "name": "Services", "tabs": [{ 
      "id": 0, "name": "Details", "layout": "hbox" 
      }, { 
      "id": 1, "name": "Sources", "layout": "hbox" 
      }, { 
      "id": 2, "name": "Paths", "layout": "hbox" 
      }, { 
      "id": 3, "name": "Ports", "layout": "hbox" 
      }, { 
      "id": 4, "name": "Levels", "layout": "hbox" 
      }, { 
      "id": 5, "name": "Notes", "layout": "hbox" 
      }] 
     }, { 
     "name": "Services2", "tabs": [{}] 
     }] 
    } 
}; 

tôi sẽ tạo ra một mô hình cho cấu hình:

Ext.define('Config', { 
    extend: 'Ext.data.Model', 
    fields: ['name'], 
    hasMany: [{ 
    name: 'someconfig', 
    model: 'Someconfig', 
    associationKey: 'someconfig' 
    }], 
    proxy: { 
    type: 'memory', 
    data: data, 
    reader: { 
     type: 'json', 
     root: 'config' 
    } 
    } 
}); 

Vì vậy Config có thể có nhiều Someconfigs vì trong dữ liệu, someconfig là một mảng của các đối tượng. Đây là mô hình Someconfig:

Ext.define('Someconfig', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'name' 
    ], 
    hasMany: [{ 
    name: 'tabs', 
    model: 'Tabs', 
    associationKey: 'tabs' 
    }] 
}); 

Ok, cùng một thỏa thuận. Someconfig có thể có nhiều Tabs vì trong dữ liệu, các tab là một mảng các đối tượng. Đây là mô hình Hợp âm:

Ext.define('Tabs', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    'id', 
    'name', 
    'layout' 
    ], 
    belongsTo: [{ 
    name: 'tabs', 
    model: 'Someconfig', 
    associationKey: 'tabs' 
    }] 
}); 

Bây giờ, hãy ở trong đó vì tôi đang bận tâm với tài sản này. Bất kể, tôi không thể truy cập Tabs từ Someconfig, nhưng tôi có thể truy cập Someconfig từ Config. Hãy nhìn vào mã này:

Config.load(1, { 
    success: function(record, operation) { 
    console.log(record.get('name')); // works 
    console.log(record.someconfig().getCount()); // works, gives me 2 
    console.log(record.someconfig().data.items[0].data); // only prints out name and config_id 
//  console.log(record.someconfig().tabs()); // doesn't exist 
    } 
}); 

jsFiddle: demo

Những gì tôi muốn biết là, tôi không nên có thể truy cập tab() từ someconfig(), hay tôi hiểu lầm các mối quan hệ? Nếu đó là cũ, làm cách nào để sửa mã của tôi?

Được đăng chéo từ Sencha forums.

Trả lời

5

Có một vài điều sai trái với cách tiếp cận của bạn ở đây:

  1. Khi bạn gọi getter cho một mối quan hệ one-to-many, bạn đang thực sự lấy một tham chiếu đến một đối tượng cửa hàng có chứa một tập hợp các đối tượng liên quan, do đó, cố gắng truy xuất mối quan hệ các tab cho cửa hàng không có ý nghĩa.
  2. Bạn phải lấy một yếu tố từ các cửa hàng mối quan hệ, và sau đó được các tab liên quan của nó bởi gọi các tab phương pháp rằng sẽ trả về một đối tượng cửa hàng có chứa một bộ các tab cho rằng ví dụ cụ thể.
  3. Nếu bạn muốn để truy cập với bất kỳ tab liên quan bạn phải một lần nữa chọn một đối tượng duy nhất của cửa hàng đó, để ngang cây mối quan hệ toàn bạn nên làm một cái gì đó như thế này:
someconfig = record.someconfig().getAt(0); 
sometab = someconfig.tabs().getAt(0); 

Dưới đây là modified version of your code hoạt động. Hy vọng nó sẽ giúp giải quyết vấn đề của bạn.

+0

Yup. Bạn hoàn toàn đúng, và đó là những kết luận tôi đã đến hôm qua sau khi chơi với nó một số chi tiết. Cảm ơn! – incutonez

+0

Điều thú vị về điều này là, 'someconfig' không hiển thị trong dữ liệu của' record' ... Tôi chỉ có thể truy cập 'someconfig' bằng cách gọi phương thức của nó. Điều này không có ý nghĩa với tôi ... nếu mô hình 'config' cóMany' someconfig', nó sẽ hiển thị trong 'config' như một mảng các mô hình! – incutonez

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