Добавить представление в открытое окно в titanium

#javascript #iphone #xml #model-view-controller #titanium

#javascript #iPhone #xml #модель-представление-контроллер #titanium

Вопрос:

У меня есть 3 представления: v1.xml , v2.xml , v3.xml . v1.xml имеет кнопку B1. Когда пользователь нажимает кнопку B1, она открывается v2.xml . v2.xml имеет еще одну кнопку B2. Когда пользователь нажимает кнопку B2, она открывается v3.xml .

Я создал окно в v1.xml . Когда я нажимаю на кнопку B2, я хочу добавить view 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

});
 

Комментарии:

1. в V1.js , попробуйте перейти $.main_window.add(v2); на $.main_window.add(view);

2. О да … это то, что у меня на самом деле было .. но это не решает мою проблему, хотя

3. Это вообще компиляция? Существует достаточное количество ошибок, которые не прошли бы этап предварительной компиляции Alloy.

Ответ №1:

  1. Вы должны передать ссылку на окно, созданное в версии V1, когда вы создаете контроллер версии V2:

    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. Или вы можете создать только один прослушиватель событий и передать его в качестве аргумента:

    V1.js

     var currentView;
    var replaceViews = function(view) {
        currentView amp;amp; $.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. Последним вариантом будет установка $.main_window в Alloy .Глобальные переменные и создание глобальной функции.

Здесь вы можете прочитать больше о передаче аргументов контроллеру Alloy и Alloy.Глобальные переменные.