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-> 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例子源码分析之一的更多相关文章
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views
这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview ...
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之二 数据处理
当我们使用jQuery时大部分时间是聚焦于Dom节点的处理,给Dom节点绑定事件等等:前端mvc框架backbone则如何呢? M-Model,Collection等,是聚焦于数据的处理,它把与后台数 ...
- Orleans例子源码
这是Orleans系列文章中的一篇.首篇文章在此 我共享以下我现在写教程的简单的Orleans例子源码. 这个代码已经是我为了写word改动过了的.不过大体内容是通用的. 我写博客总体想法是:去除所有 ...
- Shiro官方快速入门10min例子源码解析框架2-Session
Shiro自身维护了一套session管理组件,它可以独立使用,并不单纯依赖WEB/Servlet/EJB容器等环境,使得它的session可以任何应用中使用. 2-Session)主要介绍在quic ...
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...
- Vue3中的响应式对象Reactive源码分析
Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- MNIST 例程源码分析 TensorFlow 从入门到精通
按照上节步骤, TensorFlow 默认安装在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,查看目录结构: ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
随机推荐
- <<< web里面Servlet高级应用的基础介绍
Servlet中的页面跳转?两种方式,实现跳转:内部跳转(请求转发).外部跳转(重定向)内部跳转(请求转发)特点:在服务器内部完成页面之间的跳转:请求只有一次:浏览器地址不会改变.request.ge ...
- jquery ripples水波纹效果( 涟漪效果)
这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...
- 使用IExport进行图片输出出现File creation error
使用IExport进行图片输出(.JPG)时,出现如下异常File creation error. 在ESRI.ArcGIS.Output.ExportJPEGClass.FinishExport ...
- Java学习笔记12
循环 打印一个字符串(例如: "Welcome to Java!") 100次,就需要吧下面的输出语句重复写100遍,这是相当繁琐的: System.out.println(&qu ...
- 浅谈Android中layout_weight
引言 在开发android过程中,我们经常需要对界面进行按比例进行布局,我们一般都会使用layout_属性来进行设置.今天这篇文章我们就来简单介绍下layout_weight的使用和布局原理.随着做项 ...
- 深入理解javascript原型和闭包(1)——一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...
- 生成彩条的MATLAB代码
clc;close all;clear %read image % RGBimga = imread('bmpinput_1080p.bmp'); RGBimga = imread('bmpinput ...
- UI设计
微软压平的瓷砖设计符合最直接的信息接受方式,但不符合人类的审美观念. 换句话说,除了平,还有艺术,人类的脑力活动从不会平的像个白板,它是九曲十八弯的脉冲波动. 人类几千年的的审美史上,从没有出现过这种 ...
- MFC之进度条CProgressCtrl
一.成员函数简介 1.create()针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个. 2.SetRange()设置进度条的起始值和终止值. 3.SetPos()设置进度条的当 ...
- shell 脚本之获取命令输出字符串以及函数参数传递
在ubuntu 14.04之后,所有的U盘挂载也分用户之分,最近很多操作也和U盘有关,所以就研究了一上午shell脚本函数以及字符串操作的方法. 字符串操作: 获取他的命令输出比较简单,打个简单的比方 ...