我正在学习Ember,我正在寻找实现以下目标的最佳方法:
用户可以从3个按钮中进行选择以设置新游戏:2名玩家、3名玩家或4名玩家。单击其中一个将转到下一个屏幕,在该屏幕上为选定数量的玩家开始游戏。
在Ember中你会怎么做?我可以通过以下操作完成:
<button {{action "start" 2}} type="button" />
<button {{action "start" 3}} type="button" />
<button {{action "start" 4}} type="button" />
通过这种方式,我可以读取控制器的start()方法中的参数。
但我想转换到一个新的URL,为此我需要{{linkTo}}
,不是吗?但是,如何将基于按钮的值传输到新的路由/URL?因此,一个更普遍的问题是:有没有办法将一些变量"POST"或"GET"到一个新的Route/URL?有点像传统形式的帖子和重定向。我看了动态片段,但我认为这不是我想要的。
您可以向控制器添加一个方法start,该方法将读取玩家数量,并使用所有控制器都可用的transitionToRoute功能将用户转发到适用的路线。
start: function(numberOfPlayers) {
App.gameConfiguration = updateGameConfigurationBasedOnNumberOfPlayersParamAndBoundVariables();
this.transitionToRoute('games.start');
}
这将导致用户被转发到/游戏/开始路线。url中没有上下文或动态片段,但使用这种方法依赖于一些逻辑,这些逻辑已经初始化了启动游戏所需的游戏配置。
您也不必将所有属性传递到start函数中。您可以将模板上的输入字段绑定到模型中的属性,然后在start函数中使用这些绑定值来创建游戏配置。
这方面的一个变体是为路由提供上下文/在url中指定动态段。然后您的启动功能可能如下所示:
start: function(gameConfiguration) {
this.transitionToRoute('games.start', gameConfiguration);
}
这将把用户转发到类似于:/games/:game_configuration_id/start的url上,其中game_config_id指代DS的id。Model表示由玩家数量和任何其他特征组成的特定游戏配置。
您可以通过在模板中的一组游戏配置上进行迭代来设置,并将game_configuration传递到每个链接中。这样的东西就足够了:
{{#each game_config in model}}
<button {{action "start" game_config}} type="button" />
//This would be the equivalent of doing:
//<#linkTo 'games.start' game_config>
{{/if}
对于此配置,您需要GamesStartRoute,类似于:
App.GamesStartRoute = Ember.Route.extend({
model: function(params) {
return GameConfiguration.find(params.game_configuration_id);
}
});
希望这能帮助