ある Ember ルートから別のルートに移行すると、次のエラーが発生します。
Error: Object in path item_delet could not be found or was destroyed.
ルートのrenderTemplate
フックでは、次のようなことをたくさん行っています。
this.render('item_delete', { into: 'item_parent', outlet: 'item_delete' });
...そして、親/子テンプレートの合理的なツリーを持っています。ただし、「item_delete」などのテンプレートが「routeA」にレンダリングされ、「routeB」をクリックしてから「routeA」に戻ると、エラーが発生します。メモリ リークを防ぐために、ルーターが「routeA」を終了するときにビュー オブジェクトが破棄されていることを理解しています。ルートを再入力してもビューが再作成/インスタンス化/接続されない理由がわかりません。補足として、エラーが表示された場合、以前にレンダリングされたビューでこのエラー メッセージが表示されると、そのパス名は常に 1 文字短くなります。「item_delete」ではなく「item_delet」に注意してください。
私は grunt-ember-templates を使用して Handlebars テンプレートをコンパイルしているため、JSFiddle を投稿するのは少し難しいです。renderTemplate
誰かがこのコードを「目視」して、ルートまたはフックが再インスタンス化/接続/などに失敗している可能性があるという明らかな理由にフラグを立てることができるかどうか疑問に思っています. レンダリングされたテンプレート。ビューが破壊されるのを防ぐためにできる「アクティブ化/非アクティブ化」の魔法はありますか? (そもそもビュー オブジェクトを破棄する意図に反することだとは思いますが、すべての選択肢を喜んで聞きます。)
次のような Ember Route マップがあります。
App.Router.map(function () {
this.route('index', { path: '/projects' });
this.resource('items', { path: '/projects/folders' }, function() {
this.resource('item', { path: '/:item_id' }, function() {
this.route('file_uploads', { path: '/file_upload' });
});
});
});
次のように定義されたルートがあります。
App.IndexRoute = Ember.Route.extend({
redirect: function() {
this.transitionTo('items');
}
});
App.ItemsIndexRoute = Ember.Route.extend({
model: function() {
// Setting up the model
}
, setupController: function(controller, model) {
// Setting up some controllers
}
, renderTemplate: function() {
this.render('index', {
into: 'application'
, outlet: 'application'
, controller: this.controllerFor('items')
});
this.render('navbar', {
into: 'application'
, outlet: 'navbar'
, controller: this.controllerFor('currentUser')
});
this.render('items', {
into: 'index'
, outlet: 'index'
, controller: this.controllerFor('items')
});
this.render('items_toolbar', {
into: 'index'
, outlet: 'items_toolbar'
, controller: this.controllerFor('items')
});
this.render('item_rename', {
into: 'items_toolbar'
, outlet: 'item_rename'
, controller: this.controllerFor('items')
});
this.render('item_delete', {
into: 'items_toolbar'
, outlet: 'item_delete'
, controller: this.controllerFor('items')
});
// ... some more of these...
}
});
App.ItemRoute = Ember.Route.extend({
model: function (params) {
// Building the model for the route
}
, setupController: function(controller, model) {
// Setting up some controllers
}
, renderTemplate: function() {
this.render('index', {
into: 'application'
, outlet: 'application'
, controller: this.controllerFor('items')
});
this.render('navbar', {
outlet: 'navbar'
, into: 'application'
, controller: this.controllerFor('application')
});
this.render('items', {
into: 'index'
, outlet: 'index'
, controller: this.controllerFor('items')
});
this.render('items_toolbar', {
into: 'index'
, outlet: 'items_toolbar'
, controller: this.controllerFor('items')
});
this.render('item_rename', {
into: 'items_toolbar'
, outlet: 'item_rename'
, controller: this.controllerFor('items')
});
this.render('item_delete', {
into: 'items_toolbar'
, outlet: 'item_delete'
, controller: this.controllerFor('items')
});
// ... some more of these...
}
});
App.ItemFileUploadsRoute = Ember.Route.extend({
model: function() {
// Setting up the model
}
, setupController: function(controller, model) {
// Setting up some controllers
}
, renderTemplate: function() {
this.render('file_uploads', {
into: 'application'
, outlet: 'application'
, controller: this.controllerFor('fileUploads')
});
this.render('navbar', {
into: 'application'
, outlet: 'navbar'
, controller: this.controllerFor('application')
});
this.render('items_toolbar', {
into: 'file_uploads'
, outlet: 'items_toolbar'
, controller: this.controllerFor('fileUploads')
});
this.render('item_rename', {
into: 'items_toolbar'
, outlet: 'item_rename'
, controller: this.controllerFor('items')
});
this.render('item_delete', {
into: 'items_toolbar'
, outlet: 'item_delete'
, controller: this.controllerFor('items')
});
// ... some more of these...
}
});
いくつかのテンプレートとそのアウトレットをさまざまなルート/リソースに再利用しています。たとえば、上記の「items_toolbar」は、次のようなハンドルバー テンプレートにあります。
<div class="row toolbar">
<div class="col col-lg-6 text-right">
{{outlet submission_options_button}}
{{outlet submission_button}}
{{outlet create_button}}
{{outlet confirm_button}}
{{outlet cancel_button}}
{{outlet folder_actions}}
{{outlet item_rename}}
{{outlet item_delete}}
</div>
</div>
このテンプレートでは、すべてのアウトレットがレンダリングされたバッファを取得するわけではなく、他のコンテキストでは取得されます。これは、Handlebars コードの望ましくない (紛らわしい) 条件 (および通常の「isVisible」ナンセンス) を避けるために行っています。必要に応じてそのビューを「身に着けている」特定のテンプレートに興味があります。「create_button」と「cancel_button」がある場合もあれば、「cancel_button」と「folder_actions」がある場合もあります。
ルートに再び入るときに、以前にレンダリングされてから破棄されたオブジェクトを再接続、再初期化、および/または再レンダリングできるようにする確実な方法はありますか?