配置文件

在开始我们的第一个界面之前,我们需要把初始的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. 剑指Offer_编程题之二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.

  2. Intent的跳转和传值

    看了Intent的使用方法,感觉还是要做一些笔记的,首先对于Intent的跳转Activity这个功能的实现就有两种方法,也可以说有三种: 1.                  2.

  3. 解决Debian 9 iwlwifi固件缺失导致无法连接无线网络的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=692 前言: 本文介绍了解决Debian9安装完成后无法连接wifi的问题以及一些扩展知识. 问题描述: 安装Deb ...

  4. bzoj 3167 SAO

    树dp 定义f[i][j]为i在其已合并子树内排名为j的方案数 O(n2)进行子树合并 转移时枚举他在已合并子树中的排名j和新合并子树中的排名k+1 当他比他儿子大的时候$f[x][j+k]=f[x] ...

  5. BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS

    BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...

  6. CentOS7 编译安装Nginx+php并配置php-fpm模块

    1.编译安装PHP7.2.0 去官网下载安装包:http://php.net/downloads.php ,完成之后,上传至服务器,并释放压缩包 .tar.gz cd php- 因为我们需要编译安装, ...

  7. spring 上传文件文件的一个例子,

    /** * 类名称:UploadTest 类描述:创建人:zhang 创建时间:2015年3月13日 下午4:20:57 修改人:zhang * 修改时间:2015年3月13日 下午4:20:57 修 ...

  8. SpringBoot集成Security,JWT,Swagger全分析

    GitHub地址: https://github.com/li-jun0201/springsecuritydemo本项目采用SpringBoot1.5.9, SpringSecurity,JWT, ...

  9. Python 视频转字符画 - 进阶

    这篇文章是 视频转字符动画-Python-60行代码 的后续,如果感兴趣,请先看看它. 1. 速度优化 要是每次播放都要等个一分钟,也太痛苦了一点. 所以可以用 pickle 模块把 video_ch ...

  10. Ubuntu下安装mysql与mysql workbench

    Ubuntu 安装jdk:[链接] Ubuntu安装eclipse:[链接] Ubuntu下安装MySQL与mysql workbench:[链接] Ubuntu配置tomcat9:[链接] 1.su ...