user1982519
user1982519

Reputation: 515

Add view to open Window in titanium

I have 3 views: v1.xml, v2.xml, v3.xml. v1.xml has a button B1. When user clicks button B1, it opens v2.xml. v2.xml has another button B2. When user clicks button B2, it opens v3.xml.

I created a window in v1.xml. When I click on button B2, I want to add view v3 to the existing window and I do not want to create a new window. I am unable to use the window reference that I created in v1.xml as I am working in v2.xml file now.

My code:

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

});

Upvotes: 1

Views: 1528

Answers (1)

daniula
daniula

Reputation: 7028

  1. You have to pass referance to window created in V1 when you are creating V2 controller:

    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);
    });
    
  2. Or you can create just one event listener and pass it as argument:

    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);
    });
    
  3. The last option would be setting $.main_window to Alloy.Globals and creating global function.

Here you can read more about passing arguments to Alloy Controller and Alloy.Globals.

Upvotes: 2

Related Questions