0

誰かが以下のコードを見て、domain.com /#issue / 1にアクセスすると、代わりにリストであるデフォルトのアクションが表示される理由を教えてもらえますか?ただし、クリック要素をクリックしてURLが#issue / 1に変更されると、実際に機能します。

// Destroy Views
Backbone.View.prototype.close = function () {
    console.log('Closing view ' + this);
    if (this.beforeClose) {
        this.beforeClose();
    }
    this.remove();
    this.unbind();
};

// Backbone Router
var AppRouter = Backbone.Router.extend({

    initialize:function () {
        $('#header').html(new HeaderView().render().el);
    },

    routes:{
        "issue/add":"addIssue",
        "issue/:id":"viewIssue",
        "":"list",
    },

    list:function () {
        this.before(function () {
            console.log('test');
            this.issueList = new IssueCollection();
            this.issueListView = new IssueListView({model:this.issueList});
            this.issueList.fetch();
            app.showView('#content', new IssueListView({model:this.issueList}));
        });
    },

    viewIssue:function (id) {
        console.log(id, app.issueList);
        this.before(function () {
            var issue = app.issueList.get(id);
            app.showView('#content', new IssueView({model:issue}));
        });
    },

    addIssue:function () {
        this.before(function () {
            app.showView('#content', new IssueView({model:new Issue()}));
        });
    },

    showView:function (selector, view) {
        if (this.currentView)
            this.currentView.close();
        $(selector).html(view.render().el);
        this.currentView = view;
        return view;
    },

    before:function (callback) {
        if (this.issueList) {
            if (callback) callback();
        } else {
            this.issueList = new IssueCollection();
            this.issueListView = new IssueListView({model:this.issueList});
            this.issueList.fetch();
            $('#content').html(this.issueListView.render().el);
        }
    }

});

tpl.loadTemplates(['header', 'issue-details', 'issue-item', 'issues-list'], function () {
    app = new AppRouter();
    Backbone.history.start();
});

ありがとう。

4

2 に答える 2

0

以下を実行することでこれを解決しました。

tpl.loadTemplates はそれとは何の関係もないように見えますが、コールバックで .before 関数が実行される方法が原因です。

// Destroy Views
Backbone.View.prototype.close = function () {
    console.log('Closing view ' + this);
    if (this.beforeClose) {
        this.beforeClose();
    }
    this.remove();
    this.unbind();
};

// Backbone Router
var AppRouter = Backbone.Router.extend({
    initialize:function () {


        $('#header').html(new HeaderView().render().el);
    },

    routes:{
        "issue/add":"addIssue",
        "issue/:id":"viewIssue",
        "":"list",
    },

    list:function () {
        console.log('List Route');
        this.before(function () {
            this.issueList = new IssueCollection();
            this.issueListView = new IssueListView({model:this.issueList});
            this.issueList.fetch();
            app.showView('#content', new IssueListView({model:this.issueList}));
        });
    },

    viewIssue:function (id) {
        console.log('View Issue Route ' + id);
        this.before(function () {
            var issue = app.issueList.get(id);
            app.showView('#content', new IssueView({model:issue}));
        });
    },

    addIssue:function () {
        console.log('Add Issue Route');
        this.before(function () {
            app.showView('#content', new IssueView({model:new Issue()}));
        });
    },

    showView:function (selector, view) {
        if (this.currentView)
            this.currentView.close();
        $(selector).html(view.render().el);
        this.currentView = view;
        return view;
    },

    before:function (callback) {
        if(!this.issueList) {
            this.issueList = new IssueCollection();
            this.issueListView = new IssueListView({model:this.issueList});
            this.issueList.fetch({
                success: function(coll, resp) {
                  if(callback) {
                    callback();
                  }
                }});
        } else {
            if(callback) {
                callback();
            }
        }
    }

});

tpl.loadTemplates(['header', 'issue-details', 'issue-item', 'issues-list'], function () {
    app = new AppRouter();
    Backbone.history.start();
});
于 2013-03-17T21:12:28.690 に答える
0

でルーターをロードする方法に関係していると思いますtpl.loadTemplates()。jsfiddle で問題を再現しましたが、ショーの URL に移動すると問題は解消されます。

http://jsfiddle.net/HXE7K/

作業例:

于 2013-03-17T16:14:11.730 に答える