JavaScript 应用开发 #1:理解模型与集合

在 《 Backbone 应用实例 》 这个课程里面,我们会一起用 JavaScript 做一个小应用,它可以管理任务列表,应用可以创建新任务,编辑还有删除任务等等。这个实例非常好的演示了使用 JavaScript 来开发富应用,它也能让你对 JavaScript 有一个更好的理解。所以,我们接下来会分成几天,把这个小应用的功能,分成几个部分,介绍每个小功能的细节。跟着这篇文章,或者 《 Backbone 应用实例 》 这个课程,动手练习一下。效果会非常好。

在文章里面,我会把需要的代码粘出来,不过我建议你不要直接去复制跟粘贴。每一个目录,每一个文件,每一行代码,最好可以亲自动手去做出来。这期间我们也会不断的回到浏览器上去测试,这样你能更好的理解,每个步骤的作用。每一个动作,都要动手去试一下。

介绍

在开始之前,最好可以了解一点 JavaScript,jQuery,还有 Backbone 。不过,不懂也没关系,跟着这个练习去实践,不懂的地方,可以再单独去解决一下。我会在练习中提到,代码的具体的意思是什么。

要做的这个小应用,可以管理任务列表,我们需要给应用程序一个结构,也就是把应用分成几个部分,在不同的部分里面,去撰写不同的代码,这样会更容易维护一些。提供这个结构可以使用 Backbone 这个类库。在 《 基于 MVC 的 JavaScript Web 富应用开发 》 这本书里介绍了这款优秀的类库。它可以跟 jQuery 还有 Underscore很好的结合到一块儿使用,在这个应用实例里面会用到这几样东西。

下面,我们先去创建应用需要的目录和文件结构。

目录结构

根据下面的这个树形结构去创建对应的目录还有文件。应用只有一个页面,就是 index.html ,它是应用的主页。

js 目录里面是应用的主要的代码,这个目录里面,按照功能又分别创建了几个目录,Models 里面是应用的模型,Collections 里面是集合,Views 里面是视图,Routers 里面是路由器。在 js 根目录下的 app.js ,这个文件里会存储启动应用需要的一点代码。这些东西在后面,我们会一点一点去添加。

lib 这个目录里面是应用需要的各种类库,jQuery特效,jQuery插件,Underscore,Backbone,另外还有一个 Backbone 的小插件,backbone.localStorage.js。这个插件的作用就是,会用浏览器的 Local Storage 来存储数据。用 bing.com 或 google.com 去搜索一下这些东西,然后把它们下载下来,放到 lib 这个目录的下面。

assets 里面是应用需要的一点资源,一个样式表,还有一张背景图片。在这篇文章的附件里面,你可以下载到这两个资源。

.
├── assets
│   ├── base.css
│   └── bg.png
├── index.html
├── js
│   ├── Collections
│   │   └── TodoCollection.js
│   ├── Models
│   │   └── Todo.js
│   ├── Routers
│   │   └── Router.js
│   ├── Views
│   │   ├── AppView.js
│   │   └── TodoView.js
│   └── app.js
└── lib
    ├── backbone-min.js
    ├── backbone.localStorage.js
    ├── jquery-2.1.1.min.js
    └── underscore-min.js

主页的基本结构

打开应用根目录下的 index.html,在这个文档里面,需要设计一下应用需要的界面,去定义数据的模板,链接需要的样式表,依赖的库文件,还有即将要用到的 JavaScript 代码文件。选择一款简单的编辑器,比如 Brackets 编辑器,然后输入下面这些代码:

<!doctype html>
<html lang="zh-hans">
<head>
    <meta charset="UTF-8">
    <title>Todos</title>
    <link rel="stylesheet" href="http://ninghao.net/assets/base.css">
</head>
<body>

    <!-- 需要的各种类库 -->
    <script src="http://ninghao.net/lib/jquery-2.1.1.min.js"></script>
    <script src="http://ninghao.net/lib/underscore-min.js"></script>
    <script src="http://ninghao.net/lib/backbone-min.js"></script>
    <script src="http://ninghao.net/lib/backbone.localStorage.js"></script>

    <!-- 应用的代码 -->
    <script src="http://ninghao.net/js/Models/Todo.js"></script>
    <script src="http://ninghao.net/js/Collections/TodoCollection.js"></script>
    <script src="http://ninghao.net/js/Views/TodoView.js"></script>
    <script src="http://ninghao.net/js/Views/AppView.js"></script>
    <script src="http://ninghao.net/js/Routers/Router.js"></script>
    <script src="http://ninghao.net/js/app.js"></script>

</body>
</html>

应用界面需要的代码

接下来,在这个 index.html 里面,需要去设计一下应用需要的界面的 HTML 代码。这个界面的样式,已经在 assets/base.css 这个样式表里面定义好了。你可以直接把下面这些代码,放到 index.html 里面的 body 标签里面。这些代码构建起了应用的界面。

先了解这里面的其中的几个元素:

  • #todoapp,它是包装应用界面的一个容器。
  • #new-todo,这是一个 text 类型的 input 元素,就是一个文本框,用户可以在里面输入内容,来创建新的任务。
  • #todo-list,它是一个用来显示任务列表的地方。

保存一下,然后在浏览器里面去预览一下,直接打开这个 index.html 。

<div id="todoapp">
    <!-- 页头部分 -->
    <header id="header">
        <h1>todos</h1>
        <!-- 创建任务用的文本框 -->
        <input type="text" id="new-todo" placeholder="需要做点什么呢?" autofocus>
    </header>
    <!-- 主体部分 -->
    <section id="main">
        <!-- 标记所有任务为完成状态 -->
        <input type="checkbox" name="toggle-all" id="toggle-all">
        <label for="toggle-all">标记全部为完成</label>
        <!-- 显示任务列表的地方 -->
        <ul id="todo-list"></ul>
    </section>
    <!-- 页脚部分:还剩多少个没完成的任务,导航,清空完成的任务 -->
    <footer id="footer"></footer>
</div>

<div id="info">
    <p>双击可以编辑任务</p>
</div>

创建模型 - 表示任务数据

模型在 Backbone 里面,是用来表示数据的。 在我们的这个小应用里面,需要处理的数据是任务,这个任务就可以是一个模型,给这个任务模型起个合适的名字,比如 Todo 。

打开 js/Models/Todo.js,在这个文件里面,我们去定义这个任务模型:

var app = app || {};

/**
 * 模型 Model
 *
 * 创建一个叫 Todo 的模型来表示任务数据
 */
app.Todo = Backbone.Model.extend({

    defaults: {
        title: ‘‘,
        completed: false
    }

});

在文件的一开始,定义了一个叫 app 的对象,它有点像是一个命名空间,就是我们在全局范围内,只定义了一个东西,就是这个对象。这样不容易跟第三方的代码库发生命名的冲突。 在应用里面,需要用到的其它的东西,都可以作为这个 app 对象的一个属性。

var app = app || {};

app.Todo,就是定义好的用来表示任务数据的模型。在这个模型里面,用到了一个 defaults 属性,在这个属性里面,可以为模型添加默认的属性。title ,表示任务的标题,completed,表示任务的完成的状态。如果它的值是 true ,就表示任务已经完成了,如果它的值是 false ,表示任务还在进行中,默认我们让它的值默认等于 false。

创建集合 - 表示任务的列表

打开 js/Collections/TodoCollection.js。在这个文件里面,去定义表示任务列表的集合。app.TodoCollection 就是为应用创建的一个集合,跟这个集合对应的模型就是前面创建的 app.Todo 。

var app = app || {};

/**
 * 集合 Collection
 */
app.TodoCollection = Backbone.Collection.extend({

    // 指定与这个集合相关的模型
    model: app.Todo,
    // 使用 Backbone 的 LocalStorage
    // 为存储的数据添加一个 todo 前缀
    localStorage: new Backbone.LocalStorage(‘todo‘)

});

// 实例化一下 TodoCollection 这个集合
app.todoList = new app.TodoCollection;

在 Backbone 的集合里面, 有一些方法,可以保存,删除,提取数据模型。比如可以把数据存储到指定的数据源里面,我们也可以从指定的数据源那里把数据提供出来,然后把它添加到这个表示任务列表的集合里面。这些动作用的就是 jQuery 的 Ajax 方法。我们可以为应用提供一个处理数据的后台程序,比如可以使用 Drupal,WordPress 或者 Laravel 等等。

不过,在这个小应用里面,我们使用了 Backbone 的 Local Storage 插件( backbone.localStorage.js ),它会覆盖掉 Backbone 的 Sync 方法。用了这个小插件以后,Backbone 会把数据放到浏览器的 Local Storage 里面,也就是放到用户的本地浏览器里面存储起来。

localStorage: new Backbone.LocalStorage(‘todo‘)

这行代码的作用就是去使用 Backbone 的这个 Local Storage 插件,同时指定了一下数据的前缀。这里的 todo ,就是存储的数据的前缀,也可以把它想像成是一个命名空间,也就是为了避免冲突,为要存储的数据起的一个名字。

app.todoList = new app.TodoCollection;

上面这行代码的功能是实例化了一下创建的这个集合。这样在应用的其它地方,可以用到 app.todoList 这个集合对象。

练习

下面,去做几个练习,来理解一下集合,模型,还有 Backbone 的 Local Storage 插件。

  1. 在 Chrome 浏览器里打开应用程序的主页,index.html。
  2. 打开浏览器的控制台,也就是 console(Mac:alt + command + J,Windows:alt + ctrl + J)。
  3. 输入 app.todoList,回车。查看一下应用里面的集合。
  4. 观察在控制台上返回的结果,注意 length 属性的值,现在应该是 0 ,表示在这个集合里面,还没有任何的模型。
  5. 输入 app.todoList.create({title: ‘发布新的课程‘})
  6. 再查看一下 app.todoList 。
  7. 观察返回的结果,你会发现,length 属性的值会是 1 ,表示集合里面已经有了一个模型。
  8. 打开 Resources 选项卡。
  9. 找到 Local Storage,再打开 file:// 这个路径下面的 Local Storage。
  10. 观察存储在 Local Storage 里面的数据。

我们先在控制台上查看了一下 app.todoList  这个集合里的东西,发现里边儿啥也没有。然后用集合的 create 这个方法去创建了一个任务模型,指定了一个任务的title 属性的值,这个模型会被添加到集合里面,同时也会存储到指定的数据源里面,这里就是把创建的任务存储到了浏览器的 Local Storage 里面了。

再做一个练习:

  1. 刷新一下 index.html 这个页面。
  2. 在控制台里面再输入一次 app.todoList
  3. 观察返回的结果,你会看到集合里啥也没有了。
  4. 输入 app.todoList.fetch()
  5. 再输入一次 app.todoList,观察得到的结果。
  6. 再输入 app.todoList.at(0).attributes,观察得到的结果。
  7. 再输入 app.todoList.at(0).destroy()
  8. 最后再看一下 app.todoList,观察返回的结果。
  9. 打开 Resources 选项卡,Local Storage ,观察存储在本地上的数据。

在这个练习里,刷新页面以后,集合里就没有东西了。然后用集合的 fetch() 这个方法,重新从数据源那里把模型提取出来,再放到 app.todoList 这个集合里面。在这里提供数据的数据源就是浏览器的本地存储(Local Storage)。这时再次查看集合的时候,你会看到它里面又有了一个模型。

集合的 at 这个方法,可以查看集合里面指定位置上的模型,0 表示集合里的第一个模型,后面的 attributes 这个属性,可以去查看模型里面的属性。

在第 7 步里,调用了集合里的模型的 destroy() 这个方法,它的作用就是,销毁并删除模型。所以,再次查看集合的时候,length 属性的值又会变成了 0 ,同时,也会把存储在浏览器的 Local Storage 里面的东西也删除掉了。

JavaScript 应用开发 #1:理解模型与集合源码搜藏网整理,转载请注明出处http://www.codesocang.com/jiaocheng/js/9787.html

JavaScript 应用开发 #1:理解模型与集合

时间: 2024-10-29 19:05:36

JavaScript 应用开发 #1:理解模型与集合的相关文章

JavaScript 应用开发 #2:视图与模板

在用 Backbone 开发的 JavaScript 应用里面,除了模型与集合以外,另一个重要的部分就是视图,英文是 View .在视图里面,我们可以去监听在页面上发生的事件,还有与视图相关的模型和集合的事件,可以去定义处理这些事件用的方法,可以设置包装数据用的元素等等. 模型视图 下面, 先去为 Todo 这个模型的数据创建一个视图,定义这个视图的代码放在 js/Views/TodoView.js 这个文件里面.打开这个文件,输入下面这些代码: var app = app || {}; /**

JavaScript大杂烩7 - 理解内置集合

JavaScript内置了很多对象,简单的类型如String,Number,Boolean (相应的"值类型"拥有相同的方法),复杂一点的如Function,Object,Array,它们支撑起来JavaScript编程的基石.由于Number与Boolean很简单,这里就不多说了,下面着重介绍其他的内置对象. 万物之源 - Object对象 JavaScript是单根的,唯一的根就是Object对象,这个对象提供了几个还是不错的方法,值得了解一下. 1. hasOwnProperty

JavaScript 应用开发 #3:应用的主视图

目前为止,我们已经在应用里面,创建了表示数据的模型,表示数据列表的集合,组织模型显示的视图与模板.下面, 我们要想办法,去把模型的列表显示在应用的界面上.这样我们就可以再去为应用创建一个主要的视图,用它来控制应用的主要的显示. 应用视图 这个应用的主视图可以放在 js/Views/AppView.js 这个文件里面.AppView 就是应用的主视图,在这个视图里面,处理了应用需要的大部分的逻辑.在这里,也需要去监听一些事件,去定义一些方法,比如处理创建新任务的方法,把任务项目添加到页面上显示的方

JavaScript 应用开发 #5:为完成的任务添加样式

判断一下任务的状态,如果是完成的任务,可以在任务项目的上面,添加一个额外的 css 类,在这个 css 类里,可以去定义完成的任务的样式.比如,把文字的颜色变成浅友色,并且在文字上面添加一条删除线.这些样式,已经在应用的样式表里定义好了,放在了一个叫 .completed 的 css 类里面.下面,我们要做的就是把这个类添加到是完成的状态的任务项目上去. 要解决的问题 怎么样得到模型的属性的值. 怎么样为模型添加合适的 css 类. 怎么样在任务模型的完成状态发生变化时,立即更新任务项目的显示.

Javascript模块化开发-轻巧自制

Javascript模块化开发-轻巧自制 一.前言现在javascript的流行,前端的代码越来越复杂,所以我们需要软件工程的思想来开发前端.模块化是必不可少的,这样不仅能够提高代码的可维护性.可扩展性以及鲁棒性,更大的好处就是能够提升整个团队的开发效率,也能够让新进的程序员更快的接手工作.今天晚上根据前辈们的经验,写啦一个简单的模块定义的封装组件,当是练手吧.不过感觉还是蛮好用的.二.学习模块化前我们应该先了解点什么呢?其实突然就学习模块化的javascript开发,那还是比较丈二和尚,摸不着

JavaScript 应用开发 #4:切换任务的完成状态

在勾选了任务项目左边的对号(复选框)以后,会将任务的状态标记为已完成,取消勾选的话,又会把任务的状态标记为未完成.所以, 我们需要一个可以切换任务完成状态的方法.在任务模型里面,表示任务状态的属性是 completed,它的值是 true 表示任务是完成的,如果是 false 就表示任务是未完成的,这个切换完成状态的方法其实就是去修改这个 completed 属性的值. 实现这个功能,可以去监听任务项目的这个复选框的点击的事件,每次点击都会去执行一个方法,这个方法做的事就是保存与任务当前的 co

JavaScript 模块化入门Ⅰ:理解模块

作为一名JS初学者.假如你听到了一些诸如"模块化构建&模块化载入" "Webpack&Browserify" 或者 "AMD&CMD"之类的术语,肯定瞬间就凌乱了. JavaScript的模块化听起来挺深奥,可其实理解它对开发者来说特别实用. 在这篇文章里,我会尽量深入浅出地把这些深奥的术语翻译成浅显易懂的人话(加上一些代码示例).希望你多少能从中学到点东西. 为了避免长篇大论,整个内容会分为两篇文章,这是第一部分,主要介

JavaScript模块化开发小谈

在网上已经有很多关于模块化开发的文章了,这里还是按照自己的理解来整理一下. 随着项目文件的越来越大和需求的越来越贴近现实(我发现现在客户不如:一个领导说我要审批你们报上来的资料,系统发布以后用的还不错,可能是有那个新鲜感,等领导烦了说:每个文件我都这么操作太累了,能不能一次报,到最后说能不能自动判断对不对……),以后的需求估计要让做个人工智能出来……借着上面继续,需求的内容越来越复杂,一个人开发时间长,多个人开发这样那样的问题一堆等等这时候Javascript模块化开发诞生了. 先说说发展历程

软件开发生命周期模型 瀑布模型、增量模型、原型模型、螺旋模型、喷泉模型总结

在校期间学习过这些模型,现在来复习一下. 瀑布模型/改进的瀑布模型 虽然瀑布模型仍然存在很多的问题有待解决,但瀑布模型仍然是最基本的和最效的一种可供选择的软件开发生命周期模型.瀑布模型要求软件开发严格按照需求 ->分析->设计->编码->测试的阶段进行,每一个阶段都可以定义明确的产出物和验证准则.瀑布模型在每一个阶段完成后都可以 组织相关的评审和验证,只有在评审通过后才能够进入到下一个阶段. 由于需要对每一个阶段进行验证,瀑布模型要求每一个阶段都有明确的文档产出,对于严格的瀑布模型