WeX5的前端是由若干个页面构成的,运行时,页面间有以下几种关系:Shell打开页面、页面与对话框的交互、页面与内嵌页面的交互。

Shell打开页面

WeX5中,Shell负责管理所有的页面;在同一时刻,允许多个页面同时运行,有且只有一个活动页面(即当前页面)。
配合 参考案例 :/UI2/demo/page/index.w

1、打开页面
打开页面时,可以调用以下api:
justep.Shell.showPage(url, params)其中,url支持相对路径或绝对路径,也可以使用Shell的pageMapping中定义的页面标识。
通过justep.Shell.showPage打开页面时,可以通过以下三种方式传递参数:

传参方式 url参数 params params.data
实现方式 ?参数 #参数 不进url
支持分享
参数序列化 必须 必须 不需要,可以是复杂对象
触发被打开页面时间 onParamsReceive onParamsReceive onParamsReceive
被打开页面获取参数 this.getContext().getRequestParameter(name) this.params this.params.data

2、关闭页面
在WeX5中,关闭页面,可以通过以下几种方式来实现:
● 调用justep.Shell.closePage方法:默认关闭当前活动页面;
● 在页面内调用this.close方法:关闭所在页面;
● 在页面内调用window组件的close方法或操作:关闭所在页面;
发送端代码:

var url = require.toUrl('./page2.w?p1=p1Value&p2=p2Value');
		var params = {
			a1: 'a1Value',
			a2: 2,
			data: {
				d1: 'd1Value',
				d2: 'd2Value'
			}
		}
		justep.Shell.showPage(url, params)

接收端代码:

Model.prototype.modelParamsReceive = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ', p2=' + p2 + '\n';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + event.params.a1 + ', params.a2=' + event.params.a2 + '\n';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (event.params.data){
			buf += '    params.data.d1=' + event.params.data.d1 + '\n';
			buf += '    params.data.d2=' + event.params.data.d2 + '\n';
		}
		alert(buf);
	};
Model.prototype.button1Click = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ', p2=' + p2 + '\n';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + this.params.a1 + ', params.a2=' + this.params.a2 + '\n';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (this.params.data){
			buf += '    params.data.d1=' + this.params.data.d1 + '\n';
			buf += '    params.data.d2=' + this.params.data.d2 + '\n';
		}
		alert(buf);
	};

页面与对话框交互

在WeX5中,使用WindowDialog组件来实现页面与对话框间的交互。
1、打开对话框
可以调用WindowDialog组件的open({url: ”, params: {}})方法打开对话框。打开对话框时,可以通过以下方式传递参数:

传参方式 url参数 params params.data
实现方式 ?参数 #参数 不进url
支持分享
刺激对话框刷新
参数序列化 必须 必须 不需要,可以是复杂对象
触发被打开页面时间 onParamsReceive onParamsReceive onParamsReceive
被打开页面获取参数 this.getContext().getRequestParameter(name) this.params this.params.data

2、对话框向父页面返回数据
在对话框页面中,通过this.owner.send(data)方法,可以向父页面返回数据;此时会触发父页面中对应WindowDialog组件的onReceive和onReceived事件,我们可以在此事件中接收到对话框返回的数据。

3、关闭对话框
在对话框页面中,可以通过this.close或Window组件的close方法(或操作)来关闭对话框,此时会触发父页面中对应WindowDialog组件的onClose事件。
发送端代码:

	var dialog = this.comp('dialog');
		var url = require.toUrl('./dialog.w?p1=参数1&p2=参数2');
		dialog.open({
			src: url,
			params: {
				a1: '简单数据a1',
				a2: 2,
				//data是特殊的参数, 这部分内容不能被分享
				data: {
					//将一个函数传递给对话框
					fn: function(){        
						alert('将一个函数传到对话框中');
					}, 
					//将data中的一行数据传给对话框
					data1: this.comp('data1').getCurrentRow().toJson()
				} 
			}
			
		})

接收端代码:

Model.prototype.modelParamsReceive = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ', p2=' + p2 + '\n';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + event.params.a1 + ', params.a2=' + event.params.a2 + '\n';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (event.params.data){
			buf += '    params.data.fn=' + event.params.data.fn + '\n';
			this.comp('dlgData').loadData([event.params.data.data1]);
			this.comp('dlgData').first();
		}
		alert(buf);
	};


	Model.prototype.button1Click = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ', p2=' + p2 + '\n';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + this.params.a1 + ', params.a2=' + this.params.a2 + '\n';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (this.params.data){
			buf += '    params.data.fn=' + this.params.data.fn + '\n';
		}
		alert(buf);
	};

页面与内嵌页面交互

在WeX5中,如果期望在一个页面中嵌入另一个页面的内容(比如HTML中的iframe),可以使用WindowContainer组件来实现。
1、页面向内嵌页面传参数

传参方式 url参数 params params.data
实现方式 ?参数 #参数 不进url
刺激内嵌页面刷新
参数序列化 必须 必须 不需要,可以是复杂对象
触发被打开页面时间 onParamsReceive onParamsReceive onParamsReceive
被打开页面获取参数 this.getContext().getRequestParameter(name) this.params this.params.data

2、内嵌页面向父页面返回数据
在内嵌页面中,调用this.owner.send(data)方法,可以向父页面返回数据,此时会触发父页面中对应WindowContainer组件的onReceive事件,我们可以在此事件中获取内嵌页面返回的数据。

3、父页面与内嵌页面间的复杂交互
由于WeX5默认实现是单页应用模式,父页面和子页面只是一个逻辑划分,物理上还是运行在同一个HTML文档中,因此,父页面和内嵌页面间,除了上面所说的数据传递之外,还可以进行复杂的交互(比如相互调用方法等等):

1)父页面获取内嵌页面的VM实例:调用WindowContainer组件的getInnerModel()方法;
2)内嵌页面获取父页面的VM实例:this.getParentModel();

发送端代码:

	var url = require.toUrl('./page3.w?p1=p1ValueNew&p2=p2NewValueNew');
		var params = {
			a1: 'a1ValueNew',
			a2: 20,
			data: {
				d1: 'd1ValueNew',
				d2: 'd2ValueNew'
			}
		}
		this.comp('windowContainer1').load(url, params);

接收端代码:

	Model.prototype.modelParamsReceive = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ", p2=' + p2 + '; ';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + event.params.a1 + ', params.a2=' + event.params.a2 + '; ';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (event.params.data){
			buf += '    params.data.d1=' + event.params.data.d1 + '; ';
			buf += '    params.data.d2=' + event.params.data.d2 + '; ';
		}
		
		var id = this.getIDByXID("container");
		$('#' + id).text(buf);
	};

	Model.prototype.button1Click = function(event){
		var context = this.getContext();
		
		//获取URL中的参数
		var p1 = context.getRequestParameter('p1');
		var p2 = context.getRequestParameter('p2');
		var buf = '来自url的参数: p1=' + p1 + ", p2=' + p2 + '\n';
		
		//获取简单参数
		buf += '简单参数:params.a1=' + this.params.a1 + ', params.a2=' + this.params.a2 + '\n';
		
		//获取复杂参数
		buf += '复杂参数:\n'
		if (this.params.data){
			buf += '    params.data.d1=' + this.params.data.d1 + '\n';
			buf += '    params.data.d2=' + this.params.data.d2 + '\n';
		}
		alert(buf);
	};