快速构建SPA框架SalutJS--项目工程目录 三
配置文件
在开始我们的第一个界面之前,我们需要把初始的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--项目工程目录 三的更多相关文章
- 快速构建SPA框架SalutJS--项目工程目录 一
起因 刚进公司那会儿,接的是一个微信APP应用,SPA是前人搭起来的,用到的技术主要是backbone和zepto.后来那人走了,就卤煮一个人把项目接了下来.项目越是到后面,越发觉了诸多弊端,不停的增 ...
- 快速构建SPA框架SalutJS--项目工程目录 二
目录结构 上面这张图是salut的目录文档,从github上将其下载后直接运行node run和 node json 可以直接启动项目.下面逐个介绍每个目录的存放的文件和作用. constructio ...
- 使用 Spring Boot 快速构建 Spring 框架应用--转
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...
- 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer
Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...
- 使用 Spring Boot 快速构建 Spring 框架应用
Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...
- Myeclipse项目工程目录中各种Libraries的含义
MyEclipse工程目录下一般会有以下几类Libraries,如图: 各种Libraries的含义如下: JRE System Library:Java SE 的常用库文件集合,构建任何Java项目 ...
- Maven项目工程目录
maven工程目录规范: src/main/java 存放项目的.java文件 src/main/resources 存放项目的资源文件,如spring.hibernate配置文件 src/t ...
- maven项目工程目录约定
使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下: src/main/java —— 存放项目的.java文件 src/main/resources —— 存放 ...
- 快速构建hibernate框架
手动配置Hibernate框架的配置,极易出现问题,在Eclipse的web项目中,我们可以快速配置,方便快捷 一.导入Hibernate框架所需要的jar文件 二. 窗口—Perspective—打 ...
随机推荐
- ZooKeeper的使用---Java程序
一.导入库 以下库存放在目录lib中: audience-annotations-0.5.0.jar jline-0.9.94.jar log4j-1.2.17.jar netty-3.10.6.Fi ...
- 写个批处理脚本来帮忙干活--遍历文件夹&字符串处理
这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅. 前言 平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之 ...
- 概率与统计推断第一讲homework
1. 假设在考试的多项选择中,考生知道正确答案的概率为$p$,猜测答案的概率为$1-p$,并且假设考生知道正确答案答对题的概率为1,猜中正确答案的概率为$\frac{1}{m}$,其中$m$为多选项的 ...
- LoadRunner常用方法
LR常用的函数 lr_start_transaction: 为性能分析标记事务的开始 lr_end_transaction: 为性能分析标记事务的结束 lr_rendezvous: 在 Vuser 脚 ...
- selenium中的xpath定位
一.简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. 二.定位 2.1 利用自己的本身属性定位 //标签[文本属性和值] 下面百度的 ...
- HTTP状态码的详细解释,供参考
HTTP状态码详解 常用对照表 状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经 ...
- 电脑不识别U盘
最近遇到这样一个问题,现把具体问题和解决方案给大家分享一下: 系统:win10 症状:插入U盘,系统提示插入U盘的声音提示,磁盘不显示,360 无图标 原因:USB驱动出现问题 对症下药: 插入U盘右 ...
- Elasticsearch笔记八之脑裂
Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...
- 数据保存策略(Retention Policies)
数据保存策略(Retention Policies) InfluxDB没有提供直接删除Points的方法,但是它提供了Retention Policies.主要用于指定数据的保留时间:当数据超过了指定 ...
- 【Never Stop】联赛集训记录
始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...