TodoMVC中的Backbone+marionetteJS+requireJS例子源码分析之一

Marionette牵线木偶,Backbone是脊骨的意思,Marionette是基于Backbone做扩展库,可以理解为把脊骨骨架绑线扯着变成牵线木偶动起来哈哈,使backbone更易使用呵呵!

构建或者扩展了很多新的东西,如:Application,Region,ItemView,CollectionView,CompositeView,LayoutView,AppRoute,Controller等等,把很多重复性的工作变成配置,程序入口引入了集中处理器Application,貌似Marionette的module不怎么好用,还不如用requireJS来得直观。

一、文件目录

比较清晰,bower_components里面存放jQuery,underscore等等依赖js库及js框架,不用管它;css文件也不用理它。

\index.html

<!doctype html>
<html lang="en" data-framework="marionettejs">
    <head>
        <meta charset="utf-8">
        <title>Backbone.Marionette & Requirejs • TodoMVC</title>
        <link rel="stylesheet" href="bower_components/todomvc-common/base.css">
        <link rel="stylesheet" href="css/custom.css">
    </head>
    <body>
        <section id="todoapp">
            <header id="header">
            </header>
            <section id="main">
            </section>
            <footer id="footer">
            </footer>
        </section>
        <footer id="info">
            <p>Double-click to edit a todo</p>
            <p>Created by <a href="http://github.com/jsoverson">Jarrod Overson</a></p>
        </footer>
        <script src="bower_components/todomvc-common/base.js"></script>
        <script data-main="js/main" src="bower_components/requirejs/require.js"></script><!--requireJS开始加载js/main.js文件-->
    </body>

js/main.js

require.config({//requireJS配置
    paths: {//路径配置
        underscore: ‘../bower_components/underscore/underscore‘,
        backbone: ‘../bower_components/backbone/backbone‘,
        marionette: ‘../bower_components/backbone.marionette/lib/backbone.marionette‘,
        jquery: ‘../bower_components/jquery/jquery‘,
        localStorage: ‘../bower_components/backbone.localStorage/backbone.localStorage‘,
        tpl: ‘lib/tpl‘
    },
    shim: {//非AMD规范库如backbone等库的配置,deps是依赖库
        underscore: {
            exports: ‘_‘
        },
        backbone: {
            exports: ‘Backbone‘,
            deps: [‘jquery‘, ‘underscore‘]
        },
        marionette: {
            exports: ‘Backbone.Marionette‘,
            deps: [‘backbone‘]
        }
    },
    deps: [‘jquery‘, ‘underscore‘]
});

require([
    ‘app‘,
    ‘backbone‘,
    ‘routers/index‘,
    ‘controllers/index‘
], function (app, Backbone, Router, Controller) {  //requireJS标准写法
    ‘use strict‘;

    app.start();//应用启动-〉app.js

    new Router({ controller: Controller });//指定了Controller(controllers/index)的Marionette.AppRouter(routers/index)

    Backbone.history.start();//当你的所有路由创建并且设置完毕后,调用Backbone.history.start()来开始监控hashchange事件,并且分配路由
});

\app.js

/*global define */

define([
    ‘marionette‘,
    ‘collections/TodoList‘,
    ‘views/Header‘,
    ‘views/TodoListCompositeView‘,
    ‘views/Footer‘
], function (Marionette, TodoList, Header, TodoListCompositeView, Footer) {//requireJS标准写法,其实就是用function里的变量去代表相应的库/模块(注意:每个模块应该要有返回值,如app.js最后用了return window.app=app;)
    ‘use strict‘;

    var app = new Marionette.Application();
    //创建APP, Marionette官方描述为:the hub of your composite
//application. It organizes, initializes and coordinates the various pieces of your app.
    var todoList = new TodoList();//collections/TodoList, collections就是model集

    var viewOptions = {
        collection: todoList
    };

    var header = new Header(viewOptions);
    var main = new TodoListCompositeView(viewOptions);
    var footer = new Footer(viewOptions);//这三个view都是绑定collections/TodoList这个collection

    app.addRegions({//给app增加region,region顾名思义是分区处理更加灵活
        header: ‘#header‘,
        main: ‘#main‘,
        footer: ‘#footer‘
    });

    app.addInitializer(function () {//添加事件到Marionette的初始器 app启动时会被马上执行
        //show 三个region
        app.header.show(header);
        app.main.show(main);
        app.footer.show(footer);

        todoList.fetch();//collection todoList获取localstorage的数据
    });

    app.listenTo(todoList, ‘all‘, function () {//监听collection todoList 所有事件包括todoList.fetch();
        app.main.$el.toggle(todoList.length > 0);//main view执行toggle 函数
        app.footer.$el.toggle(todoList.length > 0);//footer view执行toggle 函数
    });

    app.vent.on(‘todoList:filter‘, function (filter) {//vent是用于定义供实例外部引用的函数,可以看见在controller里面trigger此函数
        footer.updateFilterSelection(filter);//执行footer view里面的函数

        document.getElementById(‘todoapp‘).className = ‘filter-‘ + (filter === ‘‘ ? ‘all‘ : filter);//纯js
    });

    app.vent.on(‘todoList:clear:completed‘, function () {//vent是用于定义供实例外部引用的函数,可以看见在footer view里面trigger此函数
        todoList.getCompleted().forEach(function (todo) {
            todo.destroy();
        });
    });

    return window.app = app;//把app绑到window全局对象并返回
});
时间: 2024-10-12 11:40:04

TodoMVC中的Backbone+marionetteJS+requireJS例子源码分析之一的相关文章

TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views

这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview, collectionview, compositeview 和layoutview. js/templates.js /*global define */ define(function (require) {//这里用了简写,因为require.js是CommonJS 模块,相当于 defin

TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之二 数据处理

当我们使用jQuery时大部分时间是聚焦于Dom节点的处理,给Dom节点绑定事件等等:前端mvc框架backbone则如何呢? M-Model,Collection等,是聚焦于数据的处理,它把与后台数据的交互封闭好,然后我们使用时可以给数据的变化绑定事件,可以相应的去更新到Dom(这里是View) V-View(Marionette扩展了,有ItemView,CollectionView,CompositeView和LayoutView),则聚焦于处理Dom节点 C-Controller:  R

Android例子源码--炫酷的仪表盘网速测试

Android例子源码--炫酷的仪表盘网速测试 本项目是一个仪表盘网速测试的安卓版本,原理就是下载一个固定大小的文件来进行测试,可以测试当前速度,和平均速度,跟电脑上的测速差不多,有一个很精美的仪表盘效果.本项目编码UTF-8默认编译版本4.2.2. 下载地址:http://www.devstore.cn/code/info/100.html 运行截图:    干货推荐: Google Android 官方培训教程中文版 第一行代码 Android编程权威指南 疯狂Android讲义(第2版)

Android例子源码动态绘制折线、圆柱、饼状图

Android例子源码动态绘制折线.圆柱.饼状图 仿天气类app绘制饼状图.折线图.柱状图的实现效果,效果挺不错,例子没有使用第三方类库,全部都是使用Canvas实现.需要的朋友可以自己下载研究下. 下载地址:http://www.devstore.cn/code/info/999.html 运行截图:   

java中的==、equals()、hashCode()源码分析(转载)

在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str

Java并发包中Semaphore的工作原理、源码分析及使用示例

1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后来的车必须在入口等待,直到停车场中有车辆离开.这时,如果有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开一辆,则又可以放入一辆,如此往复. 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用.信号量是一个非负整数,表示了当前公共资源的可用数目(在上面的

Android研发中对String的思考(源码分析)

1.常用创建方式思考: String text = "this is a test text "; 上面这一句话实际上是执行了三件事 1.声明变量 String text; 2.在内存中开辟空间 (内存空间一) 3.将变量的text的引用指向开辟的内存空间 当有 text = "this is a change text"; 这一句话执行了两件事 1.在内存中开辟空间 2.将变量text 的引用指向 新开辟的内存空间 3.内存空间一此时依然存在,这就是说明了Stri

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用 常用HandlerMethodArgumentResolver介绍 常用HandlerMethodReturnValueHandler介绍 本文开头现象解释以及解决方案 编写自定义的HandlerMet

【MVC - 参数原理】详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html SpringMVC中Controller的方法参数可以是Integer,Double,自定义对象,ServletRequest,ServletResponse,ModelAndView等等,非常灵活.本文将分析SpringMVC是如何对这些参数进行处理的,