如何在基于API的多页客户端应用程序中组织路由?

时间:2015-02-25 00:43:36

标签: javascript ruby-on-rails api web-applications

我在构建Ruby on Rails应用程序方面拥有丰富的经验。但我从未做过基于API的应用程序。最近我已经很好地学习了Knockout,因此我知道如果它是单页(SPA),如何组织我的客户端应用程序。

我遇到的问题:如果我有基于API的多页(!)应用程序,我不知道如何管理页面之间的通信。因为我可以对我页面中的所有链接进行硬编码,但如果我决定改变某些内容,它很快就会变得难以管理。我想在客户端有一些路由器。您是否了解框架,或者您是否知道如何组织所有路由?

2 个答案:

答案 0 :(得分:1)

PagerJS http://pagerjs.com/demo/#!/start是为Knockout构建的路由框架。这应该可以处理您的单页需求。

如果您指的是让您的应用与API资源保持同步:

我们有 api / user 端点。然后创建一个可供整个应用程序访问的对象,该对象管理引用用户的所有操作。像

这样的东西
var userUrl = 'api/url'
var userResource = {
    get: function(callback){
        http.get(userUrl, function(err,data){
            callback(data);
        });
    },
    save: function(user, callback){
        http.put(userUrl, function(err, data){
            //...
        });   
    },
//... and so on

通过这种方式,您不会在应用程序周围引用API网址,而只会在用户资源中引用。

答案 1 :(得分:1)

Microsoft Knockout SPA模板中使用的模式可以满足您的大部分要求。这是他们的viewmodel结构:

Login    AnotherPage    EtcPage
|_____________|____________|
              |
             App
              |
            Data

“数据”级别是您拥有所有api调用和/或本地存储/ WebSQL / IndexedDB内容的地方。您还可以在Knockout observable中存储站点范围的持久数据,以便轻松进行跨页访问。

“App”级别具有所有站点范围的视图信息,例如菜单/标题操作。由于App视图模型总是被加载,因此它是处理导航的好地方。

顶级视图模型包含仅找到那些单独页面的代码(登录等)。它们都将App和Data视图模型作为参数传递给它们:

var LoginViewModel = function(app, dataModel){
  var self = this;
  // etc...
}

现在路由: 通过保留视图模型列表,Microsoft模板如何处理路由的要点,然后根据链接点击分配当前视图模型。我真的不喜欢那种方法。

在这种情况下,我使用Finch.js进行路由。它非常容易使用,但文档是在coffeescript中,这是一个烦恼。虽然Finch确实提供了在页面之间传递参数的方法,但在这种情况下它是多余的。