配置文件

在开始我们的第一个界面之前,我们需要把初始的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. Nginx虚拟主机

    [root@Nginx-server ~]# tar zxvf nginx-1.11.2.tar.gz [root@Nginx-server ~]# useradd -M -s /sbin/nolog ...

  2. springboot整合shiro后报java.lang.ClassCastExcepting异常

    最近搭一个springboot的框架,整合了shiro和redis,由于平常习惯用热部署,所以自然的引入了热部署的包,但是引入后报如下错误: 没错,这个问题害我搞了一天,后来删除热部署,项目正常的跑飞 ...

  3. Web前端原生JavaScript浅谈轮播图

    1.一直来说轮播图都是困扰刚进业内小白的一大难点,因为我们不仅需要自己作出一个比较完美的运动框架(虽然网上一抓一大把,但是哪有比自己做出来实现的有成就感,不是吗?^_^),还必须需要非常关键性的把握住 ...

  4. Python题库

    Date:2018-05-08 1.Given: an array containing hashes of names Return: a string formatted as a list of ...

  5. sql server 高可用故障转移(4)

    二台sql服务器配置ISCSI虚拟磁盘 在上篇我们利用ISCSI Target软件在DC-ISCSCI上创建了三个ISCSI虚拟磁盘,在下面我们将为大家介绍SQL-CL01(hsr1 50)和SQL- ...

  6. Android开发——子进程更新UI

    方式一:Handler和Message ① 实例化一个Handler并重写handlerMessage()方法 private Handler handler = newHandler() { pub ...

  7. eclipse如何新建项目发布到git

    1.首先去查询本地git仓库地址 2.找到项目位置  删除git版本 3.更换git提交目标地址  目标地址是新建的git仓库地址 4.提交

  8. vue的传参方式和router使用技巧

    vue传参方法一 1,路由配置 { path: '/describe/:id', name: 'Describe', component: Describe } 2,使用方法 // 直接调用$rout ...

  9. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

  10. NET Core 跨平台执行命令、脚本

    一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...