RC-3 を実行していて、モデル フックなしで arraycontroller のコンテンツをセットアップしたいと考えています。これは、フィルタリングを追加する必要があり、トランジションごとにコンテンツをリロードしたくないためです。
this.get('content')
時々未定義であることがわかりました。これがなぜなのかわかりません。コードは次のとおりです。
App.StockRoute = Em.Route.extend({
setupController: function(controller) {
if (controller.get('content') === undefined) {
controller.set('content', App.Stock.find());
}
}
});
モデル フックの setupController の同等のコードは何ですか?
更新 これをより完全な説明として含めました。
todo アプリの残り火ガイドを参考にして、それを基に構築しました。現在、在庫レベルを管理/表示するための画面を構築しています。私がやろうとしているのは、すべて/スペシャル/在庫切れのアイテムを切り替えることができる画面を用意することです(todoに従って、それぞれに独自のルートがあります)が、画面上でリストを名前またはタグで。チャレンジを追加するために、フィルター (名前またはタグを考えてください) に基づいて画面にアイテムの数 (すべて、特別で在庫切れ) を常に表示しますが、トグル (すべてを考えてください/特別に考えてください/在庫切れ)
基本的には 1 つの画面なので、ルート コードで次のことを行いました。
App.StockIndexRoute = Em.Route.extend({
model: function() {
return App.Stock.find();
},
setupController: function(controller) {
// if (controller.get('content') === undefined) {
// controller.set('content', App.Stock.find());
// }
// sync category filter from object outside controller (to match the 3 controllers)
if (controller.get('category') != App.StockFilter.get('category')) {
controller.set('category', App.StockFilter.get('category'));
controller.set('categoryFilter', App.StockFilter.get('category'));
}
// a hack so that I can have the relevant toggle filter in the controller
if (controller.toString().indexOf('StockIndexController') > 0) {
controller.set('toggleFilter', function(stock) { return true; });
}
}
});
App.StockSpecialsRoute = App.StockIndexRoute.extend({
setupController: function(controller) {
this._super(controller);
controller.set('toggleFilter', function(stock) {
if (stock.get('onSpecial')) { return true; }
});
}
});
App.StockOutofstockRoute = App.StockIndexRoute.extend({
setupController: function(controller) {
this._super(controller);
controller.set('toggleFilter', function(stock) {
if (stock.get('quantity') === 0) { return true; }
});
}
});
ルートの唯一の違いは、モデルに適用する必要があるトグル フィルターの定義であることがわかります (在庫は、在庫/特別または在庫/在庫切れとは異なるため)。
1つのコントローラーを複数のルートにリンクする方法をまだ理解していないので、コントローラー側に次のものがあります
App.StockIndexController = Em.ArrayController.extend({
categoryFilter: undefined,
specialCount: function() {
return this.get('content').filterProperty('onSpecial', true).get('length');
}.property('@each.onSpecial'),
outofstockCount: function() {
return this.get('content').filterProperty('quantity', 0).get('length');
}.property('@each.quantity'),
totalCount: function() {
return this.get('content').get('length');
}.property('@each'),
// this is a content proxy which holds the items displayed. We need this, since the
// numbering calculated above is based on all filtered tiems before toggles are added
items: function() {
Em.debug("Updating items based on toggled state");
var items = this.get('content');
if (this.get('toggleFilter') !== undefined) {
items = this.get('content').filter(this.get('toggleFilter'));
}
return items;
}.property('toggleFilter', '@each'),
updateContent: function() {
Em.debug("Updating content based on category filter");
if (this.get('content').get('length') < 1) {
return;
}
//TODO add filter
this.set('content', content);
// wrap this in a then to make sure data is loaded
Em.debug("Got all categories, lets filter the items");
}.observes('categoryFilter'),
setCategoryFilter: function() {
this.set('categoryFilter', this.get('category'));
App.StockFilter.set('category', this.get('category'));
}
});
// notice both these controllers inherit the above controller exactly
App.StockSpecialsController = App.StockIndexController.extend({});
App.StockOutofstockController = App.StockIndexController.extend({});
そこにあります。おそらく、emberでこれを適切に行う方法が正確にわからないため、かなり複雑です。1 つの URL ベースのトグルと、これら 3 つのルートで機能するフィルターがあるという事実が、これを非常に複雑にしている部分だと思います。
誰か考えますか?