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-> js/main.js-> js/app.js ->js/routers/index.js & js/controllers/index.js)

/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是依赖库,The shim config allows us to configure dependencies for scripts that do not call define() to register a module即下面的库不是通过define()来注册成为模块的
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;监视url传值触发相应的事件 Backbone.history.start();//当你的所有路由创建并且设置完毕后,调用Backbone.history.start()来开始记录url的hash change,如果是html5还可以记录pushState等
});

js/app.js

/*global define */

define([
'marionette',
'collections/TodoList',
'views/Header',
'views/TodoListCompositeView',
'views/Footer'
], function (Marionette, TodoList, Header, TodoListCompositeView, Footer) {//requireJS标准写法,其实就是用function里的变量去表示相应的库/模块的返回值(注意:根据requireJS规范,每个模块应该要有返回值,如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全局对象并返回
});

js/routers/index.js

/*global define */
define([
'marionette'
], function (Marionette) {
'use strict'; return Marionette.AppRouter.extend({
appRoutes: {
'*filter': 'setFilter'//*splat表示可以匹配任意数量的URL形式,如路由:file/*path -> file/a/b/c.txt,传递值为/a/b/c.txt;题外的如 :param将匹配斜杠/之间单一的一个URL变量,如路由:search/:query/p:page -> #search/obama/p2,传值为"obama"和"2"
}
});
});

js/controllers/index.js

/*global define */
define([
'app'
], function (app) {
'use strict'; return {
setFilter: function (param) {
app.vent.trigger('todoList:filter', param && param.trim() || '');//根据URL中的传的值param触发app.js中定义的vent(todoList:filter)的函数
}
};
});

TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之一的更多相关文章

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

    这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview ...

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

    当我们使用jQuery时大部分时间是聚焦于Dom节点的处理,给Dom节点绑定事件等等:前端mvc框架backbone则如何呢? M-Model,Collection等,是聚焦于数据的处理,它把与后台数 ...

  3. Orleans例子源码

    这是Orleans系列文章中的一篇.首篇文章在此 我共享以下我现在写教程的简单的Orleans例子源码. 这个代码已经是我为了写word改动过了的.不过大体内容是通用的. 我写博客总体想法是:去除所有 ...

  4. Shiro官方快速入门10min例子源码解析框架2-Session

    Shiro自身维护了一套session管理组件,它可以独立使用,并不单纯依赖WEB/Servlet/EJB容器等环境,使得它的session可以任何应用中使用. 2-Session)主要介绍在quic ...

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

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  6. Vue3中的响应式对象Reactive源码分析

    Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...

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

    1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...

  8. MNIST 例程源码分析 TensorFlow 从入门到精通

    按照上节步骤, TensorFlow 默认安装在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,查看目录结构: ...

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

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

随机推荐

  1. <<< 入侵网站思路

    思路: 以下是入侵网站常用方法: 1.上传漏洞 如果看到:选择你要上传的文件 [重新上传]或者出现“请登陆后使用”,80%就有漏洞了! 有时上传不一定会成功,这是因为Cookies不一样.我们就要用W ...

  2. php 错误

    ini_set('display_errors', '1');error_reporting(E_ALL ^ E_NOTICE);   有时有了其它框架 应该用它的配置,要不然,你改了,它又改回去了: ...

  3. 问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势

    问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势 苹果首席设计师谈为何会在iOS上选择扁平风格http://ndnews.oeeee.com/html/201306/11/71078.htm ...

  4. ubuntu 系统使用

    1.ubuntu的鼠标,用起来总是感觉比windows的快一点儿,可以用以下命令来调整为默认的 root@admin-pc:~$ xset m default 2.mysql默认不允许远程连接,可以在 ...

  5. [NHibernate]Nhibernate如何映射sqlserver中image字段

    概述 有这样一个需求需要管理企业内网的信息,包括图标和链接.考虑到图标也不是很大所以就将图片直接保存在数据库中了. 但是用到Nhibernate,如何映射呢? Table 5.5. Large Obj ...

  6. Sql Server FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  7. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  8. Android之仿微信Tab滑动

    这个项目实现了以下的功能:有三个标签聊天.发现和通讯录,左右滑动下面的ViewPager可以切换不同的标签,且标签下面的蓝色条可以随着手指的滑动来实时滑动.另外,如果第二次滑动到“聊天”界面,可以在“ ...

  9. 微信安卓版下载 Android微信各版本列表

    前面ytkah弄了一个iso微信各版本列表,现在就来整一个微信 for Android各版本列表,方便大伙下载.每个版本都放出一些新的功能或修复相关错误,详情可以点击下面的版本链接进行查看.资源收集于 ...

  10. Asp.Net Core--授权介绍

    翻译如下: 授权指的是确定一个用户能够做什么的过程.例如用户可以Adam能够创建一个文档库,添加文档,编辑文档并将其删除.用户Bob可能只被授权在单个库中读取文件. 授权与验证,这是查明谁一个用户的过 ...