我在构建Ruby on Rails应用程序方面拥有丰富的经验。但我从未做过基于API的应用程序。最近我已经很好地学习了Knockout,因此我知道如果它是单页(SPA),如何组织我的客户端应用程序。
我遇到的问题:如果我有基于API的多页(!)应用程序,我不知道如何管理页面之间的通信。因为我可以对我页面中的所有链接进行硬编码,但如果我决定改变某些内容,它很快就会变得难以管理。我想在客户端有一些路由器。您是否了解框架,或者您是否知道如何组织所有路由?
答案 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确实提供了在页面之间传递参数的方法,但在这种情况下它是多余的。