使用Ember Router v2时,是否可以隐藏子状态显示在URL中?

时间:2013-04-14 02:20:27

标签: ember.js

我想在URL中没有显示路由子状态,但仍然可以利用路由类,我可以在其上定义renderTemplate,model,setupController等钩子。这可能与v2路由器有关吗?我正在使用Ember候选人2.

这是一个例子。

假设我有路线:

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

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

/exercise/:exercise_id

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

当然我可以在一些控制器变量中存储状态正确与不正确,但是后来我放松了路由类,ExerciseCorrectRoute和ExerciseIncorrectRoute的便利性,我想表现得不同,所以挂钩,如renderTemplate和setupController,很高兴在不同的地方干净地定义。

思想?

凯文

更新:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以在Ember.js - Prevent re-render when switching route中引用我的回答。

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

<强> 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);
      });
    });
  }
});