我想在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的子状态,那将会很好。
答案 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);
});
});
}
});