javascript - 路由器上的 URL 参数映射

标签 javascript spring backbone.js backbone-routing

下面是我的 spring mvc 上的路由器配置。

我的问题是如何将参数与路由器 url 映射,这样当有人通过粘贴或刷新导航到该 url 时,它将呈现确切的页面。

示例网址:http://localhost:8080/techtalks/#/viewMore/12345

publicRouter.js

define(['jquery', 'underscore', 'backbone',
    'views/publicModule/viewMoreView',
], function($, _, Backbone,
    ViewMoreView
) {

    var AppRouter = Backbone.Router.extend({
        routes: {
            // Define some URL routes
            'viewMore': 'viewMoreView',
            // Default
            '*actions': 'defaultAction'
        }
    });
    var initialize = function() {
        var app_router = new AppRouter;
        app_router.on('route:viewMoreView', function() {
            // Call render on the module we loaded in via the dependency array
            ViewMoreView.render();
        });
        Backbone.history.start();
    };
    return {
        initialize: initialize
    };
});

主干 View

define(['jquery', 'underscore', 'backbone', 
    'text!../../../viewMore.html'
], function($, _, Backbone, adminHomeTemplate) {
    var ViewMoreView = Backbone.View.extend({
        publicArticleTbl: null,
        el: $("#publicPanel"),
        render: function() {
            var data = {};
            publicArticleTbl = null;
            // template
            var compiledTemplateAdminHome = _.template(
                adminHomeTemplate, data);
            // append the item to the view's target
            this.$el.html(compiledTemplateAdminHome);
        },
        // Event Handlers
        events: {

        },
    });
    return new ViewMoreView;
});

最佳答案

直接使用回调,无需使用路由器事件。

此外,从 URL 中捕获 id 参数。

var AppRouter = Backbone.Router.extend({
    routes : {
        // the order the routes are defined is important, any route defined 
        // later takes precedence on previous routes.

        // Default
        '*actions' : 'defaultAction'
        // Define some URL routes
        'viewMore/:id':'viewMoreView',
    },

    viewMoreView: function(id){
        var view = new ViewMoreView({
            el: $("#publicPanel"),
            id: id
        });
        view.render();
    }
});
var initialize = function() {
    var app_router = new AppRouter();
    Backbone.history.start();
};

然后 View :

var ViewMoreView = Backbone.View.extend({
    // compile the template once
    template: _.template(adminHomeTemplate),

    initialize: function(options) {
        // make a copy of the options
        this.options = _.extend({ 
            /* default options goes here if any */
        }, options);

        console.log("id:", this.options.id);
    },
    render: function() {
        var data = {};

        // use the compiled template function here
        this.$el.html(this.template(data));
        return this;
    },
});

Backbone 使用标准链接,无需使用花哨的东西来调用路由。

'<a href="#/viewMore/' + item['id'] + '" >Read more</a>'

创建模块时,通常会返回构造函数而不是实例。这在重用相同 View 类型时很有帮助。当模块是全局服务时返回一个实例。

关于javascript - 路由器上的 URL 参数映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40552326/

相关文章:

java - Guava 多重映射到响应模型的映射结果

javascript - backbone.js 单页应用程序中的 URL 太长(约 98'000 个字符)

javascript - 在 jsPDF 中创建虚线或点线

javascript - 通过js中的递归调用更改树结构数据中的父属性

javascript - iframe出现错误,请转到其他网站?

javascript - fullcalendar 在 IE 中不渲染事件(所有版本)

java - 当接口(interface)作为参数给出时,依赖注入(inject)不起作用

java - Hibernate 不一致地生成重复的主键

ruby-on-rails - Backbone.js 前端和 RESTful Rails 后端?

javascript - 在 Backbone 集合中搜索,使用 React 更新 UI