Collection-backed Meteor プロトタイプ内でアイテムの遅延読み込み配列をシミュレートしようとしていますが、反応性があります。
たとえば、プロトタイプ付きの本のコレクションがあるとします。
Book = function(document) {
this._title = document.title;
this._author = document.author;
// ...
};
Books.prototype = {
get id() {
// Read-only
return this._id;
},
get title() {
return this._title;
},
set title(value) {
this._title = value;
},
// ...
};
Books = new Meteor.Collections('books', {
transform: function(doc) {
return new Book(doc);
}
});
そして今、Shelf の Shelf コレクションが必要ですが、Books を遅延ロードしたいと考えています。
Shelf = function(document) {
this._location = document.location;
this._floor = document.floor;
// ...
this._book_ids = document.book_ids;
};
Shelf.prototype = {
get id() {
// Read-only
return this._id;
},
get location() {
return this._location;
},
set location(value) {
this._location = location;
},
// ...
get book_ids() {
// This returns an array of just the book's _ids
return this._book_ids;
},
set book_ids(values) {
this._book_ids = values;
// Set _books to "undefined" so the next call gets lazy-loaded
this._books = undefined;
},
get books() {
if(!this._books) {
// This is what "lazy-loads" the books
this._books = Books.find({_id: {$in: this._book_ids}}).fetch();
}
return this._books;
}
};
Shelves = new Meteor.Collections('shelves', {
transform: function(doc) {
return new Shelf(doc);
}
});
これで、呼び出しShelf.books
てすべての を取得できる Self ができましBooks
たが、呼び出すまでロードされません。さらに、 set を呼び出すとbook_ids
データが無効になるため、次に を呼び出すと、それに関連付けられbooks
た の新しいセットが生成されます。Books
Shelf
では、これをリアクティブにするにはどうすればよいのbook_ids
でしょうか? または、さらに良いことに、 aが更新された場合、それに関連するすべて(およびそれを呼び出した人) も反応的に更新されますか?Books
Shelf.books
Book
Book
Shelf.books