Emberjs路由器:更改url哈希时状态不会更改

时间:2012-05-25 14:24:25

标签: javascript ember.js ember-old-router

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,因为它们都是叶子节点。我想我错过了一些小东西,却无法用手指抓住它。

2 个答案:

答案 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);
    });
  }

});