4

我正在学习 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}},不是吗?但是如何将基于按钮的值传输到新的 Route/URL?所以一个更普遍的问题是:有什么方法可以将一些变量“发布”或“获取”到新的路由/URL?有点像传统的表单发布和重定向。我查看了动态细分,但不是我想要的。

4

1 回答 1

4

您可以在控制器启动中添加一个方法,该方法将读取玩家数量并使用所有控制器都可用的 transitionToRoute 函数将用户转发到适用的路线。

start: function(numberOfPlayers) {
  App.gameConfiguration = updateGameConfigurationBasedOnNumberOfPlayersParamAndBoundVariables();
  this.transitionToRoute('games.start');
}

这将导致用户被转发到 /games/start 路由。url 中没有上下文或动态段,但使用此方法依赖于一些逻辑,该逻辑已初始化启动游戏所需的游戏配置。

您也不必将所有属性都传递给start函数。您可以将模板上的输入字段绑定到模型中的属性,然后在start函数中使用这些绑定值来创建游戏配置。

对此的一个变体是为路由提供上下文/在 url 中指定一个动态段。那么您的启动函数可能如下所示:

start: function(gameConfiguration) {
  this.transitionToRoute('games.start', gameConfiguration);
}

这会将用户转发到如下 URL:/games/:game_configuration_id/start,其中 game_configuration_id 指的是 DS.Model 的 id,它表示由玩家数量和任何其他特征组成的特定游戏配置。

您可以通过迭代模板中的游戏配置集来设置它,将 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);
  }
});

希望这可以帮助

于 2013-02-06T19:24:55.137 回答