从一个 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”以防止内存泄漏时,视图对象正在被破坏。我不确定为什么重新输入路线不会重新创建/实例化/连接视图。作为旁注,当出现错误时,任何先前呈现的收到此错误消息的视图总是将其路径名缩短一个字符,请注意“item_delet”而不是“item_delete”。
我正在使用 grunt-ember-templates 来编译 Handlebars 模板,因此发布 JSFiddle 有点困难。只是想知道是否有人可以“查看”此代码以标记路由或renderTemplate
挂钩可能无法重新实例化/连接/等的任何明显原因。渲染的模板。我可以做一些“激活/停用”魔法来防止视图被破坏吗?(我意识到这与破坏视图对象的意图背道而驰,但我愿意听取所有选择。)
我有一个 Ember 路线图,如下所示:
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”在 Handlebars 模板中,如下所示:
<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>
在这个模板中,并不是所有的 outlet 都会得到一个渲染到它们的缓冲区,而在其他上下文中它们会。我这样做是为了避免 Handlebars 代码中不受欢迎的(令人困惑的)条件(以及通常的“isVisible”废话)。我对给定的模板感兴趣,根据需要“佩戴”它的视图;在某些情况下,可能有“create_button”和“cancel_button”,而在其他情况下,可能有“cancel_button”和“folder_actions”。
是否有任何可靠的方法来确保在重新进入路线时,之前在其中渲染、然后销毁的任何对象都可以重新连接、重新初始化和/或重新渲染?