乐帝当年学习backbone时。最開始是看官网todoMVC的实现。后来了解到requireJS便于管理JS代码。就对官网代码做了requireJS管理。但此时乐帝感觉此时的todoMVC仍然不够简明,为了加深对MVC架构的理解。乐帝对原有appview代码进行了重构,将相关显示模块单独提取出自称view。实现view原子化。乐帝已经将这个项目上传(下载地址)。

   
增加requireJS的文件夹结构:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ3lpbGVkaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

   这里主要用到templates用于放置view相应的模板。views则相应backbone中view文件。假设说backbone是前端MVC,那么model是对数据建立模型。collection则是对model统一管理,view则起到控制器的作用,用于填充数据到模板,并渲染模板到显示。model、collection起到M作用。view起到C的作用,模板则起到V的作用。

   然后我们看一下todoMVC的效果图:





    从终于效果图。我们能够分析出,要对原有appview中解耦出原子view。就须要推断出哪些是原子view。原子view须要具备两点:

  • 具有动态交互效果
  • 与其它页面部分独立
   当然这里的原子view定义还值得商榷。乐帝依据以上两个原则对view进行了又一次划分。
 
 且看views文件夹结构:


   相应模板文件夹结构:
   须要注意的是,这里appview并没有相应的模板。而是通过设置el: "#todoapp",在index.html文件里,统一对原子view进行管理。

   以下以ToggleAllView类源码为样例,我们分析下,原子view职能的组成:
  1. define([
  2. 'jquery',
  3. 'underscore',
  4. 'backbone',
  5. 'text!templates/toggleAll.html'
  6. ], function($, _, Backbone, toggleTemplate) {
  7. var ToggleAllView = Backbone.View.extend({
  8. toggleTemplate: _.template(toggleTemplate),
  9. events: {
  10. "click #toggle-all": "toggleAllComplete"
  11. },
  12. initialize: function() {
  13. this.listenTo(this.collection, "all", this.render); //除了todoview与todomodel一一相应
  14. // 其它相关操作都会监听collection
  15. },
  16. render: function() {
  17. this.$el.html(this.toggleTemplate());
  18. var done = this.collection.done().length;
  19. var remaining = this.collection.remaining().length;
  20. this.allCheckbox = this.$("#toggle-all")[0];
  21. this.allCheckbox.checked = !remaining;
  22. return this;
  23. },
  24. toggleAllComplete: function() {
  25. var done = this.allCheckbox.checked;
  26. this.collection.each(function(todo) {
  27. todo.save({
  28. done: done
  29. });
  30. }); //这里通过推断单选框是否选中。改动全部modeldone属性
  31. }
  32.  
  33. });
  34. return ToggleAllView;
  35. });

 上述代码中职能主要有例如以下几种:

  • 设置el或tagname,用于定义在上一层view放置的位置,或包裹的标签
  • 设置相应模板(Template)
  • 定义交互事件,并连带定义交互函数
  • 初始化函数(initialize),一般设置对collection或者model的监听,用于view之间的通信
  • 渲染函数(render),用于渲染数据到模板中。设置其它一些全局函数
   由此可见。原子view将职能划分的非常清楚。这也是前端MVC架构的原因,而不是之前纯脚本时代,代码间高度耦合。牵一发而动全身。
   对于学习backbone,原子view和appview各自代码都不难理解。难于理解或者它精妙之处,在于对事件的监听机制,正是这样的机制,处理了view之间的通信,从而将松散的view拼装成性能优良的整理。

   todoView的监听:
  1. initialize: function() {
  2. this.listenTo(this.model, "change", this.render);
  3. this.listenTo(this.model, "destroy", this.remove); //当模型被删除,视图对应被移除
  4.  
  5. }

   这里对每一个todoview进行与之绑定的model数据监听。改动,则又一次渲染;销毁。则移除此todoview。

   再看ToggleAllView的监听:
  1. initialize: function() {
  2. this.listenTo(this.collection, "all", this.render); //除了todoview与todomodel一一相应
  3. // 其它相关操作都会监听collection
  4. }

 这个监听更“狠”。仅仅要collection有变动,就会又一次渲染,以达到实时交互的效果。

   那么appview是怎样管理各个子view的呢?
   且看两个appview函数:
  1. initialize: function() {
  2. // 初始化加入各种视图,新建视图并加入到父视图指定位置
  3. this.footer = this.$el.find('footer');
  4. this.main = $('#main');
  5. this.todoCollection = new todos;
  6. inputview = new InputView({
  7. collection: this.todoCollection
  8. });
  9. $("#todoapp").prepend(inputview.render().el); //加入输入框
  10.  
  11. var toggleAllview = new ToggleAllView({
  12. collection: this.todoCollection
  13. });
  14. this.main.prepend(toggleAllview.render().el); //取得数据后,再初始化
  15. this.allCheckbox = this.$("#toggle-all")[0];
  16.  
  17. this.listenTo(this.todoCollection, "add", this.addOne);
  18. this.listenTo(this.todoCollection, "reset", this.addAll);
  19. this.listenTo(this.todoCollection, "all", this.render);
  20. // 须要数据的视图。在获取数据后定义
  21. this.todoCollection.fetch();
  22. // 状态视图
  23. statusview = new StatusView({
  24. collection: this.todoCollection
  25. });
  26. this.footer.append(statusview.render().el); //取得数据后,再初始化
  27. },
  28. render: function() {
  29. // 因为设置了all监听全部collection的操作。故加入一个项就会被渲染一次,这保证了有修改都会得到渲染到页面
  30. var done = this.todoCollection.done().length;
  31. var remaining = this.todoCollection.remaining().length;
  32. this.allCheckbox = this.$("#toggle-all")[0];
  33. if (this.todoCollection.length) {
  34. //渲染时运行显示或隐藏的代码
  35. this.main.show();
  36. this.footer.show();
  37. this.footer.html();
  38. //假设collection为空的话,则清空footer
  39. } else {
  40. this.main.hide();
  41. this.footer.hide();
  42. }
  43. }, // 实现总体显示

   与原子view的差别,在于appview初始化函数除了监听collection变化外。还初始化各个原子view,并加入到指定界面位置,同一时候渲染函数依据逻辑须要。渲染整个页面。
   以上是对整个todoMVC程序的总体性架构分析。详细交互细节可查看乐帝源码。

前端编程提高之旅(六)----backbone实现todoMVC的更多相关文章

  1. 前端编程提高之旅(三)----浏览器兼容之IE6

    在爱奇艺实习期间,乐帝主要负责移动端活动页面的制作,因为移动浏览器是随着智能手机兴起的,这就决定了移动端不会重蹈浏览器兼容问题的覆辙.一開始就比較好的支持web标准,而纵观整个互联网行业,移动web开 ...

  2. 前端编程提高之旅(五)----写给大家看的css书

       自实习也有几个月的时间了,以爱奇艺实习为敲门砖.进入了眼下这家公司.假设说当初能进爱奇艺是暂时袭击DIV+CSS的话,眼下在这家公司体验到.不论什么技术都必须悉知原理,这样才干做到庖丁解牛.做一 ...

  3. 前端编程提高之旅(十)----表单验证插件与cookie插件

        实际项目开发中与用户交互的常见手法就是採用表单的形式.取得用户注冊.登录等信息.而当用户注冊或登录后又须要记住用户的登录状态.这就涉及到经常使用的两个操作:表单验证与cookie增删查找.   ...

  4. 前端编程提高之旅(十二)----position置入值应用

    这次内推项目用到的遮罩及其页面下方button都涉及一个概念position置入值得概念.效果图例如以下: 一个元素position属性不是默认值static.那么该元素被称为定位元素. 定位的元素生 ...

  5. 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性Hash算法

    目录(?)[+]   第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题 作者:July.2011.10.16.出处:http://blog.csdn.net/v_JULY_v. 引言 ...

  6. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

  7. 看github上有18万star的第一开源项目如何教你学前端编程的

    作为 Github | star 第一开源项目,已经超过18万 star:比之前最火的bootstrap的10万star还要多出8w,freeCodeCamp 越来越受关注,建站两年时间不到已经近40 ...

  8. 《windows核心编程系列》十六谈谈内存映射文件

    内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...

  9. 【干货】前端开发者最常用的六款IDE

    一.Visual Studio Code 下载地址:https://code.visualstudio.com/ 功能介绍: 微软在2015年4月30日Build 开发者大会上正式宣布了 Visual ...

随机推荐

  1. centOS设为文本启动方式

    centOS图形界面须要点用系统大量的内存和CPU资源,对于server而言,高效率是最重要的,因此将Centos 默认启动改为文本方式. 在终端中输入: vi /etc/inittab 有段说明文字 ...

  2. Android控件拖动的实现

    这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图 这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是 ...

  3. Mac Eclipse+Maven+TestNg+ReportNg 生成测试报告

    TestNG 是java 的单元测试框架,功能很强大,很方便,但是自动生成的测试报告有待改善,可以使用TestNg 自带的TestNG_xslt更改TestNG报告的样式,这里主要讲解ReportNg ...

  4. sqlserver存储过程学习笔记(一)基础知识篇(全)

    说出来有点丢人,做sqlserver应用系统近一年,竟然没有使用过存储过程,现在就好好的梳理一下对应知识,慢慢让其加入到我的项目中去吧. 存储过程的优点:1.运行效率高,提供了在服务器端快速执行sql ...

  5. Perl BEGIN块和END块

    [root@wx03 5]# cat a5.pl END {print cccccccccccc."\n"}; print "aaaaaaaaaaaaa\n"; ...

  6. spring获取bean 实例

    ApplicationContext ctx = new ClassPathXmlApplication("applicationContext.xml"); DataSource ...

  7. (原创)(C#随笔)IEnumerable< ICollection < IList区别

    public interface IEnumerable { IEnumerator GetEnumerator(); } 再看ICollection<T> public interfac ...

  8. LVS Nginx HAProxy 优缺点

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  9. 近期在调用 calendar.js 的时候出现中文乱码! 解决方式

    近期写一个小项目的时候:在调用 calendar.js  的时候出现中文乱码! 如图所看到的: 原因在于: 我的jsp 页面,指定的是 UTF-8 编码,然而,调用的 calendar.js 的编码确 ...

  10. 求第i个小的元素 时间复杂度O(n)

    #include<iostream> //求第i个小的元素 时间复杂度O(n) #include<cstdlib> #include<ctime> using na ...