Javascript 路由组件

Javascript 路由组件,javascript,knockout.js,url-routing,Javascript,Knockout.js,Url Routing,我正在考虑构建一个敲除路由引擎,它根据url参数按需加载敲除“组件”,而不是像99%的示例中那样匹配预定义的路由值。 我之所以需要它,是因为我将根据条件拥有不同数量的视图和组件 对于组件,任务很简单,我只需遵循一些示例,下面的工作对我来说很好: ko.components.loaders.push({ getConfig: function(name, callback) { var componentPieces, componentName,

我正在考虑构建一个敲除路由引擎,它根据url参数按需加载敲除“组件”,而不是像99%的示例中那样匹配预定义的路由值。 我之所以需要它,是因为我将根据条件拥有不同数量的视图和组件

对于组件,任务很简单,我只需遵循一些示例,下面的工作对我来说很好:

ko.components.loaders.push({
    getConfig: function(name, callback) {
        var componentPieces,
            componentName,
            componentNamespace

        if( name && name.indexOf('-') >= 1){
            componentPieces = name.split('-');
            componentName = componentPieces[1];
            componentNamespace = componentPieces[0];
            callback({
                viewModel: {
                    require: "components/" + componentNamespace + "/" + componentName + "ViewModel"
                },
                template: {
                    require: "text!components/" + componentNamespace + "/" + componentName + ".tmpl.html"
                }
            })

        }else{
            callback(null);
        }
    },
    //use the default loaders functionality for loading
    loadComponent: ko.components.defaultLoader.loadComponent
});
到目前为止还不错,但我在路由引擎方面遇到了困难,我正在寻找解决方案。 目前看来,这一点很有希望,但我感觉不到

define(["knockout", "crossroads", "hasher"], function(ko, crossroads, hasher) {

    var routerConfig = {
        defaultParams: { page: 'home', action: 'view' }
    };

    function Router(config) {
        var self = this;
        var currentRoute = self.currentRoute = ko.observable({});

        crossroads.addRoute(':page:/:action:', function(requestParams) {
            var routeParams = $.extend(config.defaultParams, requestParams);
            self.currentRoute(routeParams);
        });
        crossroads.bypassed.add(function(){
            self.error(404);
        });
        self.error = function(code){
            self.currentRoute({ page: 'error', code: code });
        };

        startCrossroads();
    }

    function startCrossroads() {
        function parseHash(newHash, oldHash) { crossroads.parse(newHash); }
        crossroads.normalizeFn = crossroads.NORM_AS_OBJECT;
        // crossroads.shouldTypecast = true;
        hasher.initialized.add(parseHash);
        hasher.changed.add(parseHash);
        hasher.init();
    }

    return new Router(routerConfig);
});

任何有用的资源和IDE都将不胜感激。

请查看我的博客帖子

它有一个主id供viewmodel加载
#MyMainModel

然后,它还使用散列后的查询来侦听子路由

#MyMainModel?id=5

我真的不能说这是否是一个100%的解决方案,但也许它可以给你一些建议?

看看这个漂亮的。它描述了Knockout+SammyJs应用程序,它可能非常适合您的需要。我玩了一段时间,但没有得到任何我喜欢的东西。请查看此代码,并在第一次尝试时编辑您的问题。然后,您将获得更多有用的答案,因为人们将有一个起点:这是对本演示的修改,您应该观看: