配置文件

在开始我们的第一个界面之前,我们需要把初始的html和config文件配置好。html非常简单,只需要一个div作为最外部的容器包裹着所有界面即可:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="format-detection" content="telephone=no" />
<meta name="viewport" content="user-scalable=no,initial-scale=1.0,maximum-scale=1.0,width=device-width" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<!--全屏模式-->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<!-- 基础样式文件 -->
<link rel="stylesheet" type="text/css" href="css/pdw.css">
<!-- 业务样式文件 -->
<link rel="stylesheet" type="text/css" href="css/app.css">
<title>Bonjour</title>
</head>
<body>
<!-- 最外层容器 -->
<div id="pageWindow"></div>
<!-- 引入require 载入入口文件 -->
<script data-main="construction/app" src="construction/require.js"></script>
</body> </html>

接下来我们在construction目录中配置config文件和入口app.js文件

//Config.js
define(function(){
//配置文件
return {
//模块跳转规则,在需要跳到下一个模块的默认方法需要配置
PAGERULES: {
A: ['a', 'c', 'g', 'i'],//每个模块文件下包含的界面名称小写
B: ['b', 'd', 'h', 'k'],
F: ['f', 'p', 'y', 'u'],
Z: ['z'],
Nav: ['footer', 'header']
},
//入口界面,即如果地址栏中没有输入hash 跳入哪个界面
entrePage: 'A',
//公共文件的名称
commonJsModule: 'Nav',
//界面切换动画时长 单位毫秒
pageTransformDelay: 300,
//动画弹出时长
maskTransformDelay: 300,
//html模板文件加载的路径配置
loadHtmlPath: 'js/tpl/tpl',
//模块文件加载的路径配置
loadJsPath: 'use/',
//ajax请求超时时间
ajaxDelay: 7000
}
});
//app.js
var IP = 'localhost';
require.config({
baseUrl: 'js/',
urlArgs:'version=1.0',
paths: {
salut: 'base/salut',
config: 'Config'
}
});
//require(function(base, page) {
(function(root){
require(['config'], function(C){
console.log(C)
var hash = root.location.hash.replace(/^#\/?/gi, '');
if(hash.indexOf('?')> -1 ) {
hash = hash.split('?')[0];
}
var config = C.PAGERULES;
if(hash.indexOf('/')) {
hash = hash.split('/')[0].toLocaleLowerCase();
}
for(var i in config) {
if(config[i].indexOf(hash) >-1 ) hash = i;
}
hash != '' ? hash: C.entrePage;
//首次加载文件
require([C.loadJsPath + hash], function(){
Backbone.history.start();
});
});
})(window);

 第一个界面

配置完基础文件后我们开始配置我们的第一个配置界面文件A.js:

//采用amd模式加载基础js
define(['salut'], function(_PRO_) {
//全局依赖变量pdw:创建项目界面模块 e: 公共事件函数 router:路由模块
var PDW = _PRO_.PDW, router = _PRO_.Router, _exprots = {};
//定义一个事件公共方法
function refreshPage(e) {
_exprots.A.children['g'].reloadView({
word: 'bonjour mademoiselle, je suis programs'
});
}
//A界面
_exprots.A = PDW.createPage({
//视图名称 *
name: 'a',
//界面标题 + 无需赘述
title: 'A界面',
//切换到此界面时是否重新获取数据,刷新本界面
applyChange: false,
//路由名称 +无需赘述,如果没有配置路由名称,则该界面没有加入路由规则当中去。一般是弹出界面无需配置此项
route: 'A',
//声明类型[normal, mask, navigate, child] 默认是normal
type: 'normal',
//如果该界面是某个界面的子界面,必须声明父级节点的id
//parent: 'a',
//界面加载需要的数据地址
url: 'http://' + IP + ':8800/?way=a',
//配置该页面的导航条
nav: ['Footer', 'Header'],
//本界面导航呈现的数据模型
navInfo: {iconLeft: 'lattice', iconRight: 'me'},
//backbone的界面扩展数据
view: {
//渲染之前的调用函数
beforeRender: function() { },
//渲染界面后的回调函数
afterRender: function() {
//console.log(this.$el);
},
//注册界面事件
pageEvent: {
/*自定义事件 事件名 事件绑定元素-> 事件执行的方法名 : 事件的注册方法
同样的方法会叠加,如C界面也有toPage,那么执行完C界面的toPage方法之后会 回执行此处方法,
这个前提是tap目标选择器和父级一样,因为子界面在父界面之下,父界面的方法会捕获子界面方法
*/
'tap .J-async-module->goPageB': function(e) {
router.myNavigate('B');
},
'tap .J-refresh->refreshPage': refreshPage,
'tap .J-changeNav->changeNavA': function() {
_exprots.A.children['i'].reloadView({
word: '12121
212121212'
});
},
'tap .J-local-module->goPageC': function() {
router.myNavigate('C/123/789', function() {
this.addDataToModel({
message: 'hello i am a message from page A'
})
});
}
}
},
//缺省模型数据
model: {
defaults: {
say: 'hello',
List: 'a ha good morning',
other: ''
}
}
});
return _exprots;
});

完了我再在js/tpl创建对应的模板文件tpla.html

<!-- A界面 -->
<script type="text/template" id="tpla">
<div class="banner salut-banner">
<ul class="warper salut-warper">
<li class="">1</li>
<li class="">2</li>
<li class="">3</li>
<li class="">4</li>
<li class="">5</li>
</ul>
</div>
<p class="sault-description">如果发现界面有salut-warper的元素,Salut会自动帮助你生成一个可以滑动的容器,结构如上</p>
<a class="salut-btn J-async-module">去B界面</a>
<p class="sault-description">点击按钮去B界面,异步加载B界面依赖的资源,如js html模板等</p>
<a class="salut-btn J-local-module">去C界面</a>
<p class="sault-description">点击按钮去C界面,并且将数据传入C界面。由于C是写在当前界面 无需再次请求资源文件</p>
</script>

为你的界面添加样式,在app.css中写css。然后再地址栏中输入localhost:port/page_main#A.边可以看到我们的界面了。可以看到,salut为你创建了一个名为a的div,然后给它添加了若干class。相应地应用到了很多默认样式。

交互和跳转

我们按照之前的规则创建第二个模块B,由于A和B是不同的模块文件,需要用到异步加载。现在由一个界面跳入另外一个界面需要用到一个方法:

router.myNavigate('B');

通过myNavigate方法,可以实现两个不同模块之间的跳转。

结束

本次讲述了怎么样创建界面以及如何实现两个界面之间的交互。欢迎大家关注salut项目,并对它多多提出意见和建议。https://github.com/constantince/Salut

快速构建SPA框架SalutJS--项目工程目录 三的更多相关文章

  1. 快速构建SPA框架SalutJS--项目工程目录 一

    起因 刚进公司那会儿,接的是一个微信APP应用,SPA是前人搭起来的,用到的技术主要是backbone和zepto.后来那人走了,就卤煮一个人把项目接了下来.项目越是到后面,越发觉了诸多弊端,不停的增 ...

  2. 快速构建SPA框架SalutJS--项目工程目录 二

    目录结构 上面这张图是salut的目录文档,从github上将其下载后直接运行node run和 node json 可以直接启动项目.下面逐个介绍每个目录的存放的文件和作用. constructio ...

  3. 使用 Spring Boot 快速构建 Spring 框架应用--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...

  4. 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  5. 使用 Spring Boot 快速构建 Spring 框架应用

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  6. Myeclipse项目工程目录中各种Libraries的含义

    MyEclipse工程目录下一般会有以下几类Libraries,如图: 各种Libraries的含义如下: JRE System Library:Java SE 的常用库文件集合,构建任何Java项目 ...

  7. Maven项目工程目录

    maven工程目录规范: src/main/java   存放项目的.java文件 src/main/resources   存放项目的资源文件,如spring.hibernate配置文件 src/t ...

  8. maven项目工程目录约定

    使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下: src/main/java —— 存放项目的.java文件 src/main/resources —— 存放 ...

  9. 快速构建hibernate框架

    手动配置Hibernate框架的配置,极易出现问题,在Eclipse的web项目中,我们可以快速配置,方便快捷 一.导入Hibernate框架所需要的jar文件 二. 窗口—Perspective—打 ...

随机推荐

  1. TCP入门与实例讲解

    内容简介 TCP是TCP/IP协议栈的核心组成之一,对开发者来说,学习.掌握TCP非常重要. 本文主要内容包括:什么是TCP,为什么要学习TCP,TCP协议格式,通过实例讲解TCP的生命周期(建立连接 ...

  2. tkinter调取签名网而设计签名页面

    # --*-- coding:utf-8 --*-- import tkinter as tk import re import requests from tkinter import messag ...

  3. SVN更新失败,提示locked 怎么破

    有时在svn更新或提交代码时,会报错,让你cleanup  如果cleanup解决不了,就要删除被锁定的文件夹下的文件,然后就可以更新或提交了 怎么做呢? 1.首先在CMD中进入你工作目录被锁定的文件 ...

  4. Sublime Text 3 Build 3065 License key 注册码 秘钥

    -– BEGIN LICENSE -– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC99798F ...

  5. centos系统查看系统版本、内核版本、系统位数、cpu个数、核心数、线程数

    centos查看系统版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1)查看centos内核的版本: [root@loc ...

  6. JVM学习②

    JVM运行机制 1.JVM启动流程 Java启动命令->装载配置寻找jvm.cfg->根据配置寻找JVM.dll(JVM主要实现)->初始化JVM,获得JNIEnv接口 2.JVM基 ...

  7. 测试APPEND INSERT是否产生UNDO信息的过程

    D:\>sqlplus test/testSQL*Plus: Release 11.1.0.6.0 - Production on 星期三 06月 29 19:46:41 2016Copyrig ...

  8. stats.go

    , len(c.clients))             for _, client := range c.clients {                 clients = append(cl ...

  9. 如果裸写一个goroutine pool

    引言 在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法.为了感受更深一点, ...

  10. BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数

    BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ ...