0

我希望路由子状态不会出现在 URL 中,但仍然能够利用路由类,我可以在该路由类上定义 renderTemplate、模型、setupController 等钩子。v2路由器可以做到这一点吗?我正在使用 Ember 候选版本 2。

这是一个例子。

假设我有路线:

/exercise/:exercise_id
/exercise/:exercise_id/correct
/exercise/:exercise_id/incorrect

我希望所有这些都显示在 URL 中:

/exercise/:exercise_id

因为我不希望学生直接在/correctULR 末尾输入并得到正确答案。虽然我有办法阻止它工作,但完整的路线仍然显示在 URL 中。从学生的角度来看,我只希望他们将状态视为/exercise/:exercise_id.

当然,我可以将正确与不正确的状态存储在某个控制器变量中,但随后我失去了使用路由类的便利性,ExerciseCorrectRoute 和 ExerciseIncorrectRoute,我想表现得不同,所以像 renderTemplate 和 setupController 这样的钩子是很高兴在不同的地方干净地定义。

想法?

凯文

更新:

我接受了 Dan Gebhardt 的建议,因为我喜欢尽可能地将事物保留在框架考虑的设计案例中,因为鉴于 Ember 仍在不断发展,这似乎可以减少令人头疼的问题。我也没有机会尝试 inDream 的 hack。

虽然我仍然认为如果路由器添加一个功能来屏蔽 URL 中的子状态会很好。

4

2 回答 2

1

每个路由都必须与 Ember 当前路由器的 URL 相关联。

我建议您在模板中使用条件语句来根据练习的状态exercise调用适当的路由,而不是使用多条路由。{{render}}通过这种方式,您仍然可以为每个状态维护单独的模板和控制器。

于 2013-04-14T03:10:28.490 回答
0

您可以参考我在Ember.js 中的回答 - 切换路由时防止重新渲染

如果您想手动处理状态,请重新打开您正在使用的位置 API并设置为 true。window.suppressUpdateURL

Ember.HistoryLocation:

Ember.HistoryLocation.reopen({
  onUpdateURL: function(callback) {
    var guid = Ember.guidFor(this),
        self = this;

    Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
      if(window.suppressUpdateURL)return;
      // Ignore initial page load popstate event in Chrome
      if(!popstateFired) {
        popstateFired = true;
        if (self.getURL() === self._initialUrl) { return; }
      }
      callback(self.getURL());
    });
  }
});

Ember.HashLocation:

Ember.HashLocation.reopen({
  onUpdateURL: function(callback) {
    var self = this;
    var guid = Ember.guidFor(this);

    Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
      if(window.suppressUpdateURL)return;
      Ember.run(function() {
        var path = location.hash.substr(1);
        if (get(self, 'lastSetURL') === path) { return; }

        set(self, 'lastSetURL', null);

        callback(path);
      });
    });
  }
});
于 2013-04-14T16:19:56.300 回答