Emberjs核心有一个新的路由器实现,它扩展了Ember.StateManager。 这是我目前使用的基本路由器(使用coffeescript):
Emee.set "stateManager", Ember.Router.create
location: "hash"
enableLogging: true
start: Ember.State.extend
index: Ember.State.extend
route: "/"
connectOutlets: (manager) ->
console.log(manager)
tasks: Ember.State.extend
route: "/tasks"
index: Ember.State.extend
route: "/"
show: Ember.State.extend
route: "/show"
users: Ember.State.extend
route: "/users"
index: Ember.State.extend
route: "/"
Emee是我的Ember命名空间。我有几个问题:
1)当页面加载带有散列http://localhost:3000/#tasks
的URL时,它会移动到正确的start.tasks.index状态,但是在hashChange上它只是向当前状态的routePath发送消息。
Emee.stateManager.route(“/ tasks”)也做同样的事情。它不会更改状态并向当前状态的routePath发送消息。我们需要自己实现routePath吗?如果不是,我们如何通过提供路线来改变状态?
2)我看到在进入状态时将调用哪些函数的很多变化。截至目前,“connectOutlets”似乎是进入状态时调用的函数的名称。这现在是设置控制器的正确页面吗?
更新了最新版本的ember代码。我的路由器现在看起来像这样:
Emee.Router = Ember.Router.extend
location: "hash"
enableLogging: true
root: Ember.State.extend
index: Ember.State.extend
route: "/"
redirectsTo: 'tasks.index'
tasks: Ember.State.extend
route: "/tasks"
index: Ember.State.extend
route: "/"
connectOutlets: (manager) ->
console.log("in index");
show: Ember.State.extend
route: "/show"
connectOutlets: (manager) ->
console.log("in show");
users: Ember.State.extend
route: "/users"
index: Ember.State.extend
route: "/"
Emee.initialize()
浏览器前进和后退按钮仍然无效。他们调用刚刚返回的routePath
,因为它们都是叶子节点。我想我错过了一些小东西,却无法用手指抓住它。
答案 0 :(得分:2)
这似乎是当前路由器实现中的一个错误 查看开发人员在https://github.com/emberjs/ember.js/issues/887#issuecomment-5946213留下的评论,以获得解决方法。
答案 1 :(得分:2)
最后钉了它:)从0.9.8.1开始,我们需要调整https://github.com/emberjs/ember.js/issues/887#issuecomment-5946213提供的解决方法。修复如下,在创建Ember.Location对象时将“实现”更改为“样式”。
Ember.Application.reopen({
setupStateManager: function(stateManager) {
var location = Ember.get(stateManager, 'location');
if (typeof location === 'string') {
location = Ember.Location.create({style: location});
Ember.set(stateManager, 'location', location);
}
stateManager.route(location.getURL());
location.onUpdateURL(function(url) {
stateManager.transitionTo('root');
stateManager.route(url);
});
}
});