javascript - Backbone.js 和 router.navigate

标签 javascript backbone.js navigation

我正在尝试改进我的小主干应用程序的导航。现在我只有一些使用 html 链接的简单导航,这些链接用于 href 元素中的#path/to/page。

我遇到的是当我点击其中一个然后点击后退按钮时,页面没有正确刷新,并且 HTML 内容没有改变。所以我正在尝试将导航功能合并到我的代码中。

我遇到的问题是我找不到与我当前使用的代码布局相匹配的示例,而且我不了解 backbone 如何工作以将我发现的东西改编成有用的东西。

这是我得到的:

app.js - 从 index.html 文件调用

require.config({

    baseUrl: 'js/lib',

    paths: {
        app: '../app',
        tpl: '../tpl',
        bootstrap: 'bootstrap/js/',

    },

    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        },
        'underscore': {
            exports: '_'
        }
    }
});

require([
    'jquery', 
    'backbone', 
    'app/router',
], function ($, Backbone, Router) {
    var router = new Router();
    Backbone.history.start();
});

app/router.js - 在 app.js 中实例化

define(function (require) {

    "use strict";

    var $           = require('jquery'),
        Backbone    = require('backbone'),
        WindowView   = require('app/views/Window'),

        breadcrumbs = {"Home": ""},
        $body = "",
        $content = "",
        windowView = "";

    return Backbone.Router.extend({

        initialize: function () {
            require([], function () {
                $body = $('body');
                windowView = new WindowView({el: $body}).render();
                $content = $("#content", windowView.el);
            });
        },

        routes: {
            ''                                                : 'home',
            'profile/login(/)'                                : 'candidateProfileLogin',
            'profile/manage(/)'                               : 'candidateProfileLogin',
            'profile/manage/:id(/)'                           : 'candidateProfileHome',
            'profile/manage/:id/questionnaire/:page(/)'       : 'candidateProfileQuestionnaire',
            'profile/manage/:id/:section(/)'                  : 'candidateProfileSection',
        },

        home: function (){
        },

        candidateProfileLogin: function () {
            require(['app/views/CandidateLogin'], function (CandidateLoginView) {
                console.log(Backbone.history.fragment);
                var view = new CandidateLoginView({el: $content});
                view.render();
            });
        },

        candidateProfileHome: function (id) {
            require(["app/views/Candidate", "app/models/candidate"], function (CandidateView, models) {
                var candidate = new models.Candidate({id: id});
                candidate.fetch({
                    success: function (data) {
                        var view = new CandidateView({model: data, el: $content});
                        view.render();
                    },
                    error: function (data) {
                        var view = new CandidateView({model: data, el: $content});
                        view.render();
                    }
                });
            });
        },

        candidateProfileSection: function (id, section) {
            require(["app/views/Candidate", "app/models/candidate"], function (CandidateView, models) {

                var candidate = new models.Candidate({id: id});
                candidate.fetch({
                    success: function (data) {
                        var view = new CandidateView({model: data, el: $content});
                        view.render(section);
                    },
                    error: function (data) {
                        //Output the data to the console. Let the template take care of the error pages
                        console.log(data);
                        var view = new CandidateView({model: data, el: $content});
                        view.render();
                    }
                });
            });
        },

        candidateProfileQuestionnaire: function (id, page) {
            require(["app/views/Candidate", "app/models/candidate"], function (CandidateView, models) {
                var candidate = new models.Candidate({id: id});
                candidate.fetch({
                    success: function (data) {
                        var view = new CandidateView({model: data, el: $content});
                        view.render(page);
                    },
                    error: function (data) {
                        //Output the data to the console. Let the template take care of the error pages
                        console.log(data);
                        var view = new CandidateView({model: data, el: $content});
                        view.render();
                    }
                });
            });
        },
    });
});

app/views/Candidate.js - 我正在尝试处理点击的 View

define(function (require) {

    "use strict";

    var $                     = require('jquery'),
        _                     = require('underscore'),
        Backbone              = require('backbone'),
        tpl                   = require('text!tpl/Candidate.html'),
        template              = _.template(tpl),

        CandidateErrorView    = require('app/views/CandidateError'),
        errtpl                = require('text!tpl/CandidateError.html'),
        errTemplate           = _.template(errtpl);

    return Backbone.View.extend({

        events: {
            'submit #voters-guide-personalInfo': 'savePersonalInfo',
            'submit #voters-guide-essay'       : 'saveEssay',
            'submit #voters-guide-survey'      : 'saveSurvey',
            'submit #voters-guide-endorsements': 'saveEndorsements',
            'submit #voters-guide-photo'       : 'savePhoto',

            'click #table-of-contents a' : 'navTOC',
        },

        savePersonalInfo: function (event) {
            console.log(event);
        },

        saveEssay: function (event) {
            console.log(event);
        },

        saveSurvey: function (event) {
            console.log(event);
        },

        saveEndorsements: function (event) {
            console.log(event);
        },

        savePhoto: function(event) {
            console.log(event);
        },

        navTOC: function (event) {
            console.log(event.target);
            var id   = $(event.target).data('candidate-id');
            var path = $(event.target).data('path');
            //router.navigate("profile/manage/" + id + "/" + path, {trigger: true});
        },

        render: function (page) {
            //Check to see if we have any errors
            if (!this.model.get('error')) {
                var dataToSend = {candidate: this.model.attributes};

                switch(page) {
                    case 'personalInfo':
                        template = _.template(require('text!tpl/Candidate-personalInfo.html'));
                    break;

                    case 'essay':
                        template = _.template(require('text!tpl/Candidate-essay.html'));
                    break;

                    case 'survey':
                        template = _.template(require('text!tpl/Candidate-survey.html'));
                    break;

                    case 'endorsements':
                        template = _.template(require('text!tpl/Candidate-endorsements.html'));
                    break;

                    case 'photo':
                        template = _.template(require('text!tpl/Candidate-photo.html'));
                    break;

                    default:
                    break;
                }

                this.$el.html(template(dataToSend));
                return this;
            } else {
                this.$el.html(errTemplate({candidate: this.model.attributes}));
                return this;
            }
        }
    });
});

现在,为了解决“当我按下后退按钮时页面内容没有重新加载”的问题,我一直在研究主干可用的导航功能(这:router.navigate (片段,[选项]);)。有很多关于如何使用它的示例,但它们似乎都与我正在使用的文件设置没有任何相似之处,所以我不确定如何最好地从我的 Angular 访问此功能。如果我在 View 中包含路由器文件并实例化它的新版本,分页 b/c 它会尝试再次运行初始化函数。

我真的不知道它应该如何工作。

有人能指出我正确的方向吗?

谢谢! --丽莎

附言如果有人有更好的想法,我会洗耳恭听!

最佳答案

您应该可以访问 Backbone 对象,在该对象中,可以使用 history.navigate 函数进行导航。如果您在 trigger: true 中调用它,您将调用该路由。例如:

Backbone.history.navigate("profile/manage", { trigger: true });

关于javascript - Backbone.js 和 router.navigate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918736/

相关文章:

javascript - 关于图像大小调整(视口(viewport))的几个问题

javascript - <img src>作为div中的背景图片

javascript - 设置或替换 Facebook 聊天中的 textContent

emacs - 为 Emacs 快速打开?

javascript - 如何使用 Fireproof for Firebase 从 .push 获取新生成的 key ?

javascript - 主干.js + JQuery : 'this' reference not accessible in JQuery-Event-Handler

javascript - 在 Backbone.js 中,每次有 POST 请求时如何向参数添加属性?

javascript - PDFJS 未在 pdf.worker.js (Backbone+Marionette+pdf.js) 中定义

android - 如何关闭抽屉导航以使用“返回主页”图标按钮?

CSS 菜单,悬停时显示子导航