2014-07-23 35 views
0

你好在布賴恩的幫助下,我有這個alomost工作,但我錯過了一些不讓它工作100%的東西。Viewstack正在訪問

當我跟蹤這個我會得到一個-1的命令面板,即使我登錄使用任何用戶。 我希望如果用戶登錄,取決於他們的userRole viewstack去他們的視圖。

下面你會看到我有的代碼。 更多人可以幫忙請:(

<mx:ViewStack id="parentStack" width="1280" height="768"> 
    <s:NavigatorContent id="loginVS" width="100%" height="100%" label="Login"> 
     <forms:MainSiteForm id="mainForm" horizontalCenter="0" verticalCenter="0"/> 
    </s:NavigatorContent> 
    <s:NavigatorContent id="adminVS" width="100%" height="100%" label="Admin"> 
     <s:ModuleLoader url="views/Administrator.swf"/> 
    </s:NavigatorContent> 
    <s:NavigatorContent id="salesVS" width="100%" height="100%" label="Sales"> 
    </s:NavigatorContent> 
    <s:NavigatorContent id="designersVS" width="100%" height="100%" label="Designers"> 
    </s:NavigatorContent> 
    <s:NavigatorContent id="retailersVS" width="100%" height="100%" label="Retailers"> 
    </s:NavigatorContent> 
</mx:ViewStack> 

<fx:Script> 
     <![CDATA[ 
      import mx.containers.ViewStack; 
      import mx.controls.Alert; 
      //import mx.core.Container; 
      import mx.core.FlexGlobals; 
      import mx.validators.Validator; 

      [Bindable] 
      private var validatorArr:Array; 
      private var loader:URLLoader; 
      private var externalXML:XML; 

      /** 
      * Initialization method 
      */ 
      public function init():void { 
       // Add validators to array for validating all at one time 
       validatorArr = new Array(); 
       validatorArr.push(useridValidator); 
       validatorArr.push(passwordValidator); 
      } 

      /** 
      * User's information checking 
      * based on the inputted data 
      */ 
      public function loginCheck():void { 
       // Starting to validate 
       var errorArr:Array = Validator.validateAll(validatorArr) 
       // if the error array contain any data, =&gt; error 
       var isValid:Boolean = errorArr.length == 0; 

       if (isValid) { 
        // Load user data 
        doLogin(); 
       } 
      } 

      private function doLogin():void { 
       // Point to the data file's path 
       var request:URLRequest = new URLRequest("data/Users.xml"); 

       loader = new URLLoader(); 
       try { 
        loader.load(request); 
       } catch (error:SecurityError) { 
        trace("A SecurityError has occurred."); 
       } 

       // If error, go to errorHandler function 
       loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
       // once the load action was complated, go to loaderCompleteHandler() for 
       // checking user information 
       loader.addEventListener(Event.COMPLETE, loaderCompleteHandler); 
      } 

      private function loaderCompleteHandler(event:Event):void { 
       var logged:Boolean = false; 
       try { 
        // Convert data into E4X class for easy access to elements 
        externalXML = new XML(loader.data); 

        // Loop through the user list to check 
        // if the inputted user id and password are valid 
        for each (var user:XML in externalXML.elements()) { 
         if (user.userID == userID.text && user.userPW == userPW.text) { 
          // user has an valid account 
          logged = true; 
          // Don't need to continue 
          break; 
         } 
        } 
        if (logged) { 
         // Redirect user function 
         var indexArr:Array = new Array("Login", "Admin", "Sales", "Designers", "Retailers"); 
         var stackIndex:int = indexArr.indexOf(user.userRole); 
         FlexGlobals.topLevelApplication.parentStack.selectedIndex = stackIndex; 
         trace(stackIndex); 
         //Alert.show('Congratulation, you logged in!', 'Information'); 
        } else { 
         Alert.show('User ID or Password is not correct, please try again!', 'Error'); 
        } 

       } catch (e:TypeError) { 
        trace("Could not parse the XML file."); 
       } 
      } 
      private function errorHandler(e:IOErrorEvent):void { 
       Alert.show("Had problem loading the XML File."); 
      } 

     ]]> 
    </fx:Script> 

---------------------------------- ---------------- XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
    <user> 
     <userID>admin</userID> 
     <userPW>password</userPW> 
     <userRole>Admin</userRole> 
    </user> 
    <user> 
     <userID>sales</userID> 
     <userPW>password</userPW> 
     <userRole>Sales</userRole> 
    </user> 
    <user> 
     <userID>designer</userID> 
     <userPW>password</userPW> 
     <userRole>Designers</userRole> 
    </user> 
    <user> 
     <userID>buyer</userID> 
     <userPW>password</userPW> 
     <userRole>Retailers</userRole> 
    </user> 
</users> 

回答

0

一種解決方案是使用selectedIndex和查找所需的索引在數組中。最重要的一點是要確保您的數組條目與您獲得的角色名稱匹配:user.userRole

if (logged) { 
    // Redirect user function 
    var indexArr:Array = new Array("Login", "Admin", "Sales", "Designers", "Retailers"); 
    //Make sure that `user.userRole` is a String, not e.g. an XML object's value. 
    var stackIndex:int = indexArr.indexOf(user.userRole); 
    FlexGlobals.topLevelApplication.parentStack.selectedIndex = stackIndex; 

請注意,拉動ab在你的Main.mxml類中的函數將是一個很好的改進;保持對ViewStack的引用不會泄漏到代碼的其他部分。

+0

你好布萊恩...哇,這很好...我會明天嘗試這第一件事,讓你知道...我怎麼能改善你說的方式?我應該怎麼做才能完成:) – Alex

+0

你好大腦,我剛剛測試了代碼,但它並沒有做任何事情:( – Alex

+0

它停留在登錄視圖 – Alex