Backbone.js路由器未检测到URL更改



查看此示例,看来路由器应检测链接,从而导致匹配其路由的URL更改。但是,单击我的车把模板生成的链接仅更改URL,并且不会触发路由器中的警报。由于某种奇怪的原因,该路线是在刷新时触发的,尽管URL松开了哈希。

我不确定为什么路由器不拿起我的URL更改。我更喜欢使用链接而不是路由器。驱逐它们是否有效。该路由确实适用于默认路线。

下面的backbone.js代码是在$(文档)上运行的。

项目车把模板

{{#with lobby}}
<li id="lobby-{{id}}">
    <div class="lobby_info">{{name}} - {{owner}} - {{player_count}}/18</div> <a href="#lobby/{{id}}">Join</a>
 </li>
 {{/with}}

项目骨干视图

var LobbyView = Backbone.View.extend({
    events: {
        "click .lobby_info": "expand_toggle",
    },
    expand_toggle: function(evt) {
        alert('Expand toggle');
    },
    render: function() {
        var template = Handlebars.compile($("#lobby_template").html());
        this.$el.html(template(this.model.toJSON()));
        return this;
    }
});

项目收集视图

var LobbiesView = Backbone.View.extend({
    events: {
        "submit #create_lobby_form": "create_lobby",
    },
    create_lobby: function(evt) {
        evt.preventDefault()
        var val = $('#lobby_name').val();
        socket.emit('create', val);
        $("#lobby_name").val("");
    },
    initialize: function() {
        var me = this;
        socket.on('create', function(lobby) {
            var lobby_item = new LobbyView({
                model: new LobbyModel({
                    lobby: lobby
                })
            });
            // render it to the DOM
            el = lobby_item.render().el;
            me.$("#lobbies").append(el);
       });
    },
    render: function() {
        var me = this;
        var template = Handlebars.compile($("#lobbies_template").html());
        $(this.el).html(template());
        return this;
    },
});

路由器

var Router = Backbone.Router.extend({
    // Match urls with methods
    routes: {
        "": "index",
        "lobby/:lobby_id": "lobby",
        "player/:player_id": "player"
    },
    index: function() {
        // connect to the websocket
        socket = io.connect();
        socket.emit('subscribe');
        var view = new LobbiesView({
            el: $("#container"),
        });
        view.render();
    },
    // View a lobby
    lobby: function(lobby_id) {
        alert('Viewing lobby' + lobby_id);
    },
    // View a player
    player: function(player_id) {
    },
});
// start backbone routing
var app = new Router();
Backbone.history.start({ pushState: true });

您的问题是{ pushState: true }。将其删除,您的路由器将工作(在控制台中测试)。如果将pushState设置为true,则需要设置没有哈希的路线。

这是我正在测试的代码:

var Router = Backbone.Router.extend({
    routes: {
        "": "index",
        "lobby/:lobby_id": "lobby",
        "player/:player_id": "player",
        "*actions": "test"
    },
    test: function() { 
        console.log('test', arguments) 
    },
    index: function() {
        console.log('index', arguments);
    },
    player: function() {
        console.log('player', arguments);
    },
    lobby: function(lobby_id) {
        console.log('lobby', arguments);
    }
});
// start backbone routing
var app = new Router();
Backbone.history.start();

最新更新