如何使用itemControllerClass使用ember.js实现类似于singleton的体验



我有一个相当简单的表单,但它永远不应该携带任何状态。我开始阅读一篇旧的讨论,讨论如何使用itemControllerClass在每次进入路由时创建一个"singleton"类。

如果我想使用这个,我该如何将它插入模板并从父控制器连接起来?

以下是我猜你会从javascript端做的事情

App.FooController = Ember.Controller.extend({
itemControllerClass: 'someclass_name'
});

唯一的"必须拥有"是我需要从子单例控制器访问父路由参数。

任何指导都将是极好的-提前感谢!

更新

只是为了明确我的用例——这不是一个ArrayController。我实际上只有一个控制器(如上所示)。我不需要代理一个模型或模型数组。我正在寻找一种方法来指向一个url(带有一些参数),并在加载路由(或显示父控制器)时生成一个新实例。

我这么做是因为模板是一个简单的"空白表单",它不应该也不应该携带状态。当用户保存表单并转换到索引路由时,该表单中发生的一切都可能随之消失(因为我已经将数据缓存在ember数据中或完成了$.ajax/等)

有人知道如何用控制器实现这种无状态行为吗?

我打赌你在谈论这个讨论。这是我个人最喜欢的与Ember有关的发现之一。它的结果是ArrayController的itemController属性;我一直在用它。它的基本要点是,当您在数组控制器上迭代时,您可以在循环中更改支持控制器。因此,每次循环迭代,它都会提供您指定类型的新控制器。您可以将itemController指定为ArrayController上的属性,也可以指定为{{#each}}}手把助手上的选项。所以,你可以这样做:

App.FooController = Ember.ArrayController.extend({
itemController: 'someclass'
});
App.SomeclassController = Ember.ObjectController.extend({});

或者,像这样:

{{#each something in controller itemController='someclass'}}
...
{{/each}}

在itemController中,您可以访问父控制器(在本例中为FooController),如:

this.get('parentController');

或者,可以使用needs指定依赖项,就像通常在控制器中一样。因此,只要参数对parentController可用,您就应该能够在子控制器上访问它们。

更新

在听到更多关于用例的信息后,每次特定路线发生转换时,控制器的状态都需要重置。听起来正确的方法是为控制器建立一个支持模型。然后,您可以在路由的一个挂钩上创建一个新的模型实例;可能是CCD_ 2或CCD_。

来源http://emberjs.com/api/classes/Ember.ArrayController.html

有时,您希望在#each帮助程序的主体中显示计算的属性,这些属性依赖于内容中的基础项,但不存在于这些项上。要做到这一点,请将itemController设置为将包装每个单独项的控制器(可能是ObjectController)的名称。

例如:

{{#each post in controller}}
<li>{{title}} ({{titleLength}} characters)</li>
{{/each}}
App.PostsController = Ember.ArrayController.extend({
itemController: 'post'
});
App.PostController = Ember.ObjectController.extend({
// the `title` property will be proxied to the underlying post.
titleLength: function() {
return this.get('title').length;
}.property('title')
});

在某些情况下,根据特定项目返回不同的itemController是有帮助的。子类可以通过重写lookupItemController来实现这一点。

例如:

App.MyArrayController = Ember.ArrayController.extend({
lookupItemController: function( object ) {
if (object.get('isSpecial')) {
return "special"; // use App.SpecialController
} else {
return "regular"; // use App.RegularController
}
}
});

itemController实例的parentController属性将设置为ArrayController的parentCntroller属性或设置为ArranController实例本身。

最新更新