изменение selectedIndex из файла AS - PullRequest
0 голосов
/ 12 марта 2011

У меня есть простая функция кнопки, которая изменяет selectedIndex в стеке представления без использования компонента строки меню. Я вызываю функцию из свойства click на кнопке и передаю int как индекс, к которому я хочу перейти. Когда у меня был код в файле приложения MXML, все работало нормально. После перемещения скрипта действий в отдельный файл я получаю доступ к неопределенным ошибкам свойств:

protected function changeView(index:int):void
{
    myViewStack.selectedIndex = index;

}

Как мне получить файл .as для распознавания компонента myViewStack? Нужно ли ссылаться на Main.MXML где-нибудь в файле .as? Спасибо.

Вот остаток моего кода:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:comps ="components.*"
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1100" minHeight="1000" width="100%" height="100%" pageTitle="List Giant v2.3">

<mx:ViewStack id="lgViewStack" width="100%" height="100%" verticalCenter="0" horizontalCenter="0" selectedIndex="0">

<s:NavigatorContent label="HOME" width="100%" height="100%" id="homeView">
  <s:VGroup width="100%" height="100%" verticalCenter="0" horizontalCenter="0" gap="0" id="homeMainVG">
    <comps:TopNav>
    </comps:TopNav>

    <s:HGroup width="100%" height="90%" gap="0">
      <comps:LeftNav>
      </comps:LeftNav>

      <comps:HomeContent>
      </comps:HomeContent>

      <comps:RightNav>
      </comps:RightNav>
    </s:HGroup>
  </s:VGroup>
</s:NavigatorContent>
</mx:ViewStack>
</s:Application>

Я покажу вам компоненты HomeContent.mxml, поскольку у него есть все проблемы, которые есть у других страниц, но самый маленький файл:

<?xml version="1.0" encoding="utf-8"?>

<fx:Script source="../actions/ButtonHandlers.as"/>

<s:layout>
    <s:BasicLayout/>
</s:layout>
<s:Panel width="30%" height="200" left="10" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
    <s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(6,lgViewStack);"/>
    <s:Label y="10" text="My Admin" horizontalCenter="0" fontWeight="bold" fontSize="24"/>
    <s:Label y="102.95" text="Click here to update your account information and settings." height="44" width="174" textAlign="center" horizontalCenter="-1" fontSize="10"/>
</s:Panel>
<s:Panel width="30%" height="200" horizontalCenter="0" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
    <s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(2,lgViewStack);"/>
    <s:Label y="10" text="My Counts" horizontalCenter="0" fontWeight="bold" fontSize="24"/>
    <s:Label y="113.95" text="Click here to see you list counts." textAlign="center" verticalAlign="middle" horizontalCenter="0"/>
</s:Panel>
<s:Panel width="30%" height="200" right="10" top="0" dropShadowVisible="false" chromeColor="#FFFFFF" borderVisible="true">
    <s:layout>
        <s:BasicLayout/>
    </s:layout>
    <s:Button label="Go" horizontalCenter="0" verticalCenter="0" width="50%" click="changeView(4,lgViewStack);"/>
    <s:Label y="18" text="My Orders" horizontalCenter="0" fontSize="24" fontWeight="bold"/>
    <s:Label y="117" text="Click here to see your lsit orders." textAlign="center" verticalAlign="middle" horizontalCenter="0"/>
</s:Panel>
<s:Panel width="96%" height="75%" horizontalCenter="0" bottom="50" dropShadowVisible="false">
    <s:Label text="List Giant Community News" left="10" top="10" fontWeight="bold" fontSize="20"/>
    <s:SkinnableDataContainer width="100%" height="100%" left="0" top="35"/>
    <mx:HRule horizontalCenter="0" top="225" width="90%"/>
    <mx:HRule horizontalCenter="0" top="450" width="90%"/>
    <s:Label x="32" y="46" text="LG World"/>
    <s:Label x="32" y="233" text="Promotions"/>
    <s:Label x="32" y="458" text="Resources"/>
</s:Panel>

И, наконец, файлы .as с рассматриваемой функцией:

import mx.containers.ViewStack;

protected function changeView(index:int, myViewStack:ViewStack):void
{
myViewStack.selectedIndex = index;

}

Ответы [ 2 ]

0 голосов
/ 12 марта 2011

Когда вы вынули ActionScript из класса mxml, вы вывели его из области видимости. В функции, где у вас есть этот код

myViewStack.selectedIndex = index;

Вы пытаетесь сослаться на myViewStack внутри файла класса, который не существует.

myViewStack.selectedIndex = index;

- это то же самое, что сказать

this.myViewStack.selectedIndex = index;

это относится к классу, в котором находится метод.

В классе, в котором есть метод changeView, вам нужно создать публичную переменную myViewStack. Затем сразу после создания экземпляра класса в mxml вам нужно назначить myViewStack

var myClass:MyClassWithchangeView = new MyClassWithchangeView ( );
myClass.myViewStack = viewStackSource;
0 голосов
/ 12 марта 2011

Вы переместили свой AtionScript во включаемый файл?Или новый класс?Как этот новый файл включен в файл приложения MXML?Я подозреваю, что ваша проблема является предметом рассмотрения.Я собираюсь продолжить писать в предположении, что вы создали новый класс.Итак, у вас есть что-то вроде этого:

Основное приложение| - Класс с функцией ChangeView| - ViewStack

в такой архитектуре;Основное приложение может вызывать методы или устанавливать свойства в классе changeView или в ViewStack.Класс changeView или ViewStack может «общаться» с основным приложением, отправляя событие.Однако класс changeView никак не может взаимодействовать с ViewStack;и ViewStack не может общаться с классом changeView.

Причина, по которой в этой архитектуре класс changeView получает ошибку "неопределенное свойство", заключается в том, что в классе changeView нет переменной с именем myViewStack.Он ничего не знает ни о переменных экземпляра / потомках своего родителя, ни о его дочерних элементах.

У вас есть несколько опций:

Пусть класс changeView отправляет событие, которое основное приложение будет слушать, изатем измените selectedIndex на ViewStack.Это звучит излишне;и почти полностью игнорирует цель «инкапсуляции» этой функциональности.

Вы можете передать переменную viewStack в класс changeView либо в качестве аргумента, либо установить ее как переменную экземпляра и изменить ее таким образом.,Вот так:

protected function changeView(index:int, myViewStack:ViewStack):void
{
    myViewStack.selectedIndex = index;

}

Это бы сработало, хотя я не уверен, что это то, что вы имели в виду.

...