我有3个视图:v1.xml,v2.xml,v3.xml。 v1.xml有一个按钮B1。当用户单击按钮B1时,它将打开v2.xml。 v2.xml有另一个按钮B2。当用户单击按钮B2时,它将打开v3.xml。
我在v1.xml中创建了一个窗口。当我点击按钮B2时,我想将视图v3添加到现有窗口,我不想创建新窗口。我无法使用我在v1.xml中创建的窗口引用,因为我现在正在使用v2.xml文件。
我的代码:
V1.xml
<Alloy>
<Window id="main_window">
<View id="v1">
<Button id="B1" />
</View>
</Window>
</Alloy>
V2.xml
<Alloy>
<View id="v2">
<Button id="B2" />
</View>
</Alloy>
V3.xml
<Alloy>
<View id="v3">
<Label id="l3" text="test label"/>
</View>
</Alloy>
V1.js
$b1.addEventListener('click', function() {
var view = Alloy.createController("V2").getView();
$.main_window.remove(v1);
$.main_window.add(view);
});
V2.js
$.b2.addEventListener('click', function(){
var view = Alloy.createController("V3").getView();
//Add this view to main_window
});
答案 0 :(得分:2)
在创建V2控制器时,必须将referance传递给在V1中创建的窗口:
<强> V1.js 强>
$b1.addEventListener('click', function() {
var view = Alloy.createController("V2", { main_window: $.main_window }).getView();
$.main_window.remove(v1);
$.main_window.add(view);
});
<强> V2.js 强>
var args = arguments[0] || {};
var main_window = args.main_window;
$.b2.addEventListener('click', function(){
var view = Alloy.createController("V3").getView();
main_window.add(view);
});
或者您只能创建一个事件侦听器并将其作为参数传递:
<强> V1.js 强>
var currentView;
var replaceViews = function(view) {
currentView && $.main_window.remove(currentView);
$.main_window.add(view);
currentView = view;
}
$.b1.addEventListener('click', function() {
var view = Alloy.createController('V2', { delegate: replaceViews }).getView();
replaceViews(view);
});
<强> V2.js 强>
var args = arguments[0] || {};
var replaceViews = args.delegate;
$.b2.addEventListener('click', function() {
var view = Alloy.createController('V3').getView();
replaceViews(view);
});
最后一个选项是将$ .main_window设置为Alloy.Globals并创建全局函数。
您可以在此处详细了解passing arguments to Alloy Controller和Alloy.Globals。