1

我有两个选项卡的视图。单击选项卡时,我想:

  1. 显示选项卡
  2. 将哈希更改为#view/tabName

#view/tab1如果和之间的哈希值发生变化#view/tab2,则不会触发路由,但视图会显示tab2。如果哈希值从#anotherView变为#view/tabName,则路由将触发,并使用初始选项卡tabName呈现视图。

总而言之,当哈希在具有相同前缀的哈希之间发生变化时#view视图将处理该事件,否则由路由器处理。

这是我当前的代码。

// router.js
define('router', [
    'jquery'
    , 'underscore'
    , 'backbone'
    , 'SomeView'

], function (
    $, _, backbone, SomeView
) {
    var router;

    router = backbone.Router.extend({
        routes: {
            'some-view': someView
            , 'some-view/:tab': someView
        }
        , initialize: function () {

        }
        , someView: function (tab) {
            var view; 
            view = new SomeView(tab);
            view.on('router:changeTab', function (tab) {
                that.navigate('some-view/' + tab);
            });


        }
    });
    return router;
});

// someView.js
define('SomeView', [
    'jquery'
    , 'underscore'
    , 'backbone'
], function (
    $, _, backbone
) {
    var SomeView;

    SomeView = backbone.View.extend({

        initialize: function (options) {
            this.tab = options.tab;

        }
        , render: function (callback) {

            // show the initial tab if given
            if (this.tab) {
                setTimeout(function () {
                    that.$el.find('[href="#' + that.tab + '-tab"]').click();
                }, 0);
            }

            return this;
        }
        , events: {
            , 'click .nav-tabs>li>a': 'showTab' // enable tabs
        }

        , showTab: function (e) {
            var that, tab, tabs;
            that = this;
            e.preventDefault();
            $(this).tab('show');  // I'm using bootstrap tab plugin
            // update hash
            tab = $(e.currentTarget).attr('href').split('-')[0].split('#')[1];
            that.trigger('router:changeTab', tab);
            // What I didn't know is how to prevent the handler from being 
            // invoked when the user press backward/forward button on the browser,
            // and let this view handle it (show the corresponding tab). 
        }
    return SomeView;
});
4

1 回答 1

0

您可以使用动态路由,您可以在其中指定以下路由:

routes : {
  "view/:tab_name" : "show_tab",
  "otherRoutes" : "other_methods"
},

show_tab : function(tab_name) {
  // render tab based on the parameter you receive
}

因此,如果地址栏包含 url #view/tab1,那么您将在 show_tab 方法中收到 'tab1' 作为 tab_name 参数,对于 #view/tab2 也是如此。

您可以参考Thomas Davis的此链接以了解有关骨干路由器的更多信息。

于 2012-08-17T06:09:16.797 回答