如何使用knockout.js构建单页面应用程序?

时间:2012-02-11 17:06:25

标签: javascript knockout.js

我主要想知道如何组织模态窗口和动态页面(如配置文件)。 viewModel应该只包含一个配置文件视图还是包含所有加载的配置文件?这里看起来并不是很“干净”。

viewModel = {
  profile: ko.observableArray([
    new ProfileViewModel()
    //... any others loaded
  ])
, createPostModal: {
    input: ko.observable()
  , submit: //do something to submit...
  }
}

<div data-bind="foreach: profile"><!-- profile html --></div>
<div data-bind="with: createPostModal"></div>

这种方式似乎不太一致。是否有人建立了一个可以提供一些建议的淘汰单页面应用程序?代码样本将不胜感激。

5 个答案:

答案 0 :(得分:15)

我们刚开始走这条路,所以不太确定我们在做什么。但这是我们的想法。

页面应由任意数量的&#34;组件组成,&#34;可能是嵌套的。每个组件都有一个视图模型和一个公共方法renderTo(el),基本上是

ko.applyBindings(viewModelForThisComponent, el)

它还可以渲染子组件。

构建或更新组件包括为其提供一个模型(例如来自服务器的JSON数据),从中派生出适当的视图模型。

然后通过嵌套一堆组件来创建应用程序,从顶级应用程序组件开始。


以下是"hypothetical"图书管理应用程序的示例。组件为LibraryUI(显示所有图书标题的列表)和DetailsUI(显示图书详情的应用程序部分)。

function libraryBookViewModel(book) {
  return {
    title: ko.observable(book.title),
    showDetails: function () {
      var detailsUI = new BookDetailsUI(book);
      detailsUI.renderTo(document.getElementById("book-details"));
    }
  };
}

function detailsBookViewModel(book) {
  return {
    title: ko.observable(book.title),
    author: ko.observable(book.author),
    publisher: ko.observable(book.publisher)
  };
}

function LibraryUI(books) {
  var bookViewModels = books.map(libraryBookViewModel);
  var viewModel = {
    books: ko.observableArray(bookViewModels);
  };

  this.renderTo = function (el) {
    ko.applyBindings(viewModel, el);
  };
}

function BookDetailsUI(book) {
  var viewModel = detailsBookViewModel(book);

  this.renderTo = function (el) {
    ko.applyBindings(viewModel, el);
  };
}

请注意我们如何通过更改要执行的#book-details函数来使书籍详细信息显示在jQuery UI对话框中,而不是单个showDetails元素中

var dialogEl = document.createElement("div");
detailsUI.renderTo(dialogEl);
$(dialogEl).dialog();

答案 1 :(得分:11)

有3个框架可以帮助使用Knockoutjs创建SPA。

我使用过杜兰达,我非常喜欢它。易于使用,并具有许多不错的配置,因此您可以插入自己的实现。此外,Durandal是由Caliburn的同一创建者创建的,这是一个非常流行的构建Silverlight / WPF应用程序的框架。

答案 2 :(得分:6)

现在在2014年,您可能希望使用Knockout的组件功能和Yeoman来支撑您的初始ko项目。观看此视频:Steve Sanderson - Architecting large Single Page Applications with Knockout.js

答案 3 :(得分:3)

[2013年4月5日更新] 在撰写本文时,此答案有效。目前我还建议采用Durandal JS方法。或者如果您使用的是ASP.NET MVC,请检查John Papa's Hot Towel or Hot Towelette SPA templates。这也使用Durandal。

以下原始答案:

我想向你指出关于Knockout.js的Phillipe Monnets 4部分系列节目。他是我遇到的第一个在多个文件中分割他的示例项目的Blogger。我非常喜欢他的大部分想法。我唯一遗漏的是如何使用某种Repository / Gateway模式处理ajax / rest检索的集合。这是一个很好的阅读。

第1部分的链接:http://blog.monnet-usa.com/?p=354

祝你好运!

答案 4 :(得分:1)

我只是开源了我将Knockout作为主要组件放在一起的迷你SPA框架。

<强>敲除的水疗 一个迷你(但功能齐全的)SPA框架,建立在Knockout,Require,Director,Sugar之上。 https://github.com/onlyurei/knockout-spa

现场演示: http://knockout-spa.mybluemix.net

功能

  • 路由(基于Flatiron的Director):HTML5历史记录(pushState)或哈希。
  • 高度可组合和可重复使用:在页面特定的JS中为页面选择模块/组件,它们将自动连接到页面的HTML模板
  • SEO ready(prerender.io)
  • 快速轻巧(85 KB的JS缩小和gizpped)
  • 用于生产的JS的双层捆绑构建:大多数页面将使用的通用模块,以及将延迟加载的特定于页面的模块
  • 有组织的文件夹结构,可帮助您保持理智,以便组织和重用JS,CSS,HTML
  • 使用Knockout 3.3.0+为Knockout的Web组件和自定义标签(http://knockoutjs.com/documentation/component-overview.html)做好准备
  • 所有文档都在主要依赖项的主页中,因此您无需完全学习新的框架