2015-06-15 55 views
2

我正在爲應用程序執行介紹屏幕。此屏幕(3張幻燈片)僅在新用戶身上出現。所以我做的方式是:當使用ng時,離子視圖標題不顯示 - 如果

  1. 默認路由總是將這個簡介屏幕

  2. 從前奏屏控制器,檢查(餅乾),看看用戶是否已經見過這個屏幕。視具體情況而定,撥打$scope.showIntro。然後做$state.go()到下一個主要應用程序屏幕。

  3. 在介紹視圖中,使用ng-if="showIntro"。所以如果$ scope.showIntro == false,那麼DOM是空白的。

這裏是棘手的部分:

  1. 有沒有辦法來檢查用戶是否已經看到這個畫面或不是因爲我使用$localStorage,它不存在應用程序( )當我創建路線。這就是爲什麼我必須在控制器中執行此檢查邏輯。

  2. 我不得不使用ng-if,因爲如果我使用ng-show,速度太慢,用戶在路由到主屏幕之前會看到一段介紹屏幕。

問題:

如果我在ion-view組件使用ng-if,標題沒有得到刷新一旦DOM被注入到視圖一次。 這是爲什麼,以及如何解決這個問題?也許某種方式可以重新運行摘要?

代碼http://codepen.io/hawkphil/pen/jPLqge

angular.module('ionicApp', ['ionic']) 
 
    
 
.config(function($stateProvider, $urlRouterProvider) { 
 
    
 
$stateProvider 
 
     .state('intro', { 
 
     url: '/', 
 
     templateUrl: 'templates/intro.html', 
 
     controller: 'IntroCtrl' 
 
     }) 
 
     .state('main', { 
 
     url: '/main', 
 
     templateUrl: 'templates/main.html', 
 
     controller: 'MainCtrl' 
 
     }); 
 
    
 
     $urlRouterProvider.otherwise("/"); 
 
    
 
    }) 
 
    
 
    .controller('IntroCtrl', function($scope, $state, $ionicSlideBoxDelegate) { 
 
     $scope.title = "<b>CUSTOM</b> TITLE"; 
 
     $scope.showIntro = true; 
 
     
 
     // Called to navigate to the main app 
 
     $scope.startApp = function() { 
 
     $state.go('main'); 
 
     }; 
 
     $scope.next = function() { 
 
     $ionicSlideBoxDelegate.next(); 
 
     }; 
 
     $scope.previous = function() { 
 
     $ionicSlideBoxDelegate.previous(); 
 
     }; 
 
    
 
     // Called each time the slide changes 
 
     $scope.slideChanged = function(index) { 
 
     $scope.slideIndex = index; 
 
     }; 
 
    }) 
 
    
 
    .controller('MainCtrl', function($scope, $state) { 
 
     console.log('MainCtrl'); 
 
     
 
     $scope.toIntro = function(){ 
 
     $state.go('intro'); 
 
     } 
 
    });
body { 
 
     cursor: url('http://ionicframework.com/img/finger.png'), auto; 
 
    } 
 
    .slider { 
 
     height: 100%; 
 
    } 
 
    .slider-slide { 
 
     padding-top: 80px; 
 
     color: #000; 
 
     background-color: #fff; 
 
     text-align: center; 
 
    
 
     font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 
 
     font-weight: 300; 
 
    } 
 
    
 
    #logo { 
 
     margin: 30px 0px; 
 
    } 
 
    
 
    #list { 
 
     width: 170px; 
 
     margin: 30px auto; 
 
     font-size: 20px; 
 
    } 
 
    #list ol { 
 
     margin-top: 30px; 
 
    } 
 
    #list ol li { 
 
     text-align: left; 
 
     list-style: decimal; 
 
     margin: 10px 0px; 
 
    } 
 
    
 
    .button.ng-hide{ 
 
     display:none; 
 
    }
<html> 
 
     <head> 
 
     <meta charset="utf-8"> 
 
     <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
 
     <title>Ionic App</title> 
 
    
 
     <link href="//code.ionicframework.com/nightly/css/ionic.css" rel="stylesheet"> 
 
     <script src="//code.ionicframework.com/nightly/js/ionic.bundle.js"></script> 
 
     </head> 
 
    
 
     <body ng-app="ionicApp"> 
 
    
 
     <ion-nav-bar class="bar-light"> 
 
      <ion-nav-back-button> 
 
      </ion-nav-back-button> 
 
     </ion-nav-bar> 
 
    
 
     <ion-nav-view></ion-nav-view> 
 
    
 
    
 
     <script id="templates/intro.html" type="text/ng-template"> 
 
      <ion-view view-title="{{ title }}" ng-if="showIntro"> 
 
      <ion-nav-buttons side="left"> 
 
       <button class="button button-positive button-clear no-animation" 
 
         ng-click="startApp()" ng-show="!slideIndex"> 
 
       Skip Intro 
 
       </button> 
 
       <button class="button button-positive button-clear no-animation" 
 
         ng-click="previous()" ng-show="slideIndex > 0"> 
 
       Previous Slide 
 
       </button> 
 
      </ion-nav-buttons> 
 
      <ion-nav-buttons side="right"> 
 
       <button class="button button-positive button-clear no-animation" 
 
         ng-click="next()" ng-show="slideIndex != 2"> 
 
       Next 
 
       </button> 
 
       <button class="button button-positive button-clear no-animation" 
 
         ng-click="startApp()" ng-show="slideIndex == 2"> 
 
       Start using MyApp 
 
       </button> 
 
      </ion-nav-buttons> 
 
      <ion-slide-box on-slide-changed="slideChanged(index)"> 
 
       <ion-slide> 
 
       <h3>Thank you for choosing the Awesome App!</h3> 
 
       <div id="logo"> 
 
        <img src="http://code.ionicframework.com/assets/img/app_icon.png"> 
 
       </div> 
 
       <p> 
 
        We've worked super hard to make you happy. 
 
       </p> 
 
       <p> 
 
        But if you are angry, too bad. 
 
       </p> 
 
       </ion-slide> 
 
       <ion-slide> 
 
       <h3>Using Awesome</h3> 
 
       
 
       <div id="list"> 
 
        <h5>Just three steps:</h5> 
 
        <ol> 
 
        <li>Be awesome</li> 
 
        <li>Stay awesome</li> 
 
        <li>There is no step 3</li> 
 
        </ol> 
 
       </div> 
 
       </ion-slide> 
 
       <ion-slide> 
 
       <h3>Any questions?</h3> 
 
       <p> 
 
        Too bad! 
 
       </p> 
 
       </ion-slide> 
 
      </ion-slide-box> 
 
      </ion-view> 
 
     </script> 
 
    
 
     <script id="templates/main.html" type="text/ng-template"> 
 
      <ion-view hide-back-button="true" view-title="Awesome"> 
 
      <ion-content class="padding"> 
 
       <h1>Main app here</h1> 
 
       <button class="button" ng-click="toIntro()">Do Tutorial Again</button> 
 
      </ion-content> 
 
      </ion-view> 
 
     </script> 
 
     
 
     </body> 
 
    </html>

編輯1

http://plnkr.co/edit/1FYr6GK6xMQjp9hA3N0M?p=preview

回答以下的前妻僅當介紹狀態具有/作爲url路由時纔有效。但是如果你把/intro或其他網址,狀態不斷迭代(截圖)。

function config($stateProvider, $urlRouterProvider) { 
    $stateProvider 

    .state('intro', { 
     url: '/intro', 
     templateUrl: 'intro.html', 
     controller: 'IntroCtrl', 
     data: { 
     isIntro: true 
     },   
    }) 

    .state('main', { 
     url: '/main', 
     templateUrl: 'main.html', 
     controller: 'MainCtrl', 
     data: { 
     isIntro: false 
     },    
    }); 

    $urlRouterProvider.otherwise("/intro"); 
} 

enter image description here

+0

嘗試使用ng-show而不是ng-if。 – Ved

回答

1

您可以檢查您的localStorage的觀點開始使用$stateChangeStart前:

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
    console.log("$rootScope => $stateChangeStart => " + toState.name || ''); 

    if (toState.data && angular.isObject(toState.data)) { 
    if (toState.data.isIntro && $localStorage.visitedIntro) 
    { 
     event.preventDefault(); 
     $state.go("main"); 
    } 
    } 
}); 

我所做的是附加屬性的每一個狀態,所以我確切地知道哪一個是介紹(數據。isIntro):

.state('intro', { 
    url: '/', 
    templateUrl: 'intro.html', 
    controller: 'IntroCtrl', 
    data: { 
    isIntro: true 
    },   
}) 

.state('main', { 
    url: '/main', 
    templateUrl: 'main.html', 
    controller: 'MainCtrl', 
    data: { 
    isIntro: false 
    },    
}) 

前RUOTE變化$stateChangeStart我檢查本地存儲有visitedIntro字段集。如果它被設置,我去主要路線。

在您的介紹控制器,你可以設置的localStorage屬性的值:

.controller('IntroCtrl', function($scope, $state, $ionicSlideBoxDelegate, $localStorage) { 

    $scope.title = "<b>CUSTOM</b> TITLE"; 
    $scope.showIntro = true; 

    // Called to navigate to the main app 
    $scope.startApp = function() { 
    $state.go('main'); 
    }; 
    $scope.next = function() { 
    $ionicSlideBoxDelegate.next(); 
    }; 
    $scope.previous = function() { 
    $ionicSlideBoxDelegate.previous(); 
    }; 

    // Called each time the slide changes 
    $scope.slideChanged = function(index) { 
    $scope.slideIndex = index; 
    if (index === 2) 
    { 
     $localStorage.visitedIntro = true; 
    } 
    }; 

}); 

當用戶滑動併到達最後一張幻燈片我設置$localStorage.visitedIntro = true

if (index === 2) 
{ 
    $localStorage.visitedIntro = true; 
} 

如果你想怎麼看呢作品檢查完整示例here

當然這只是一個選項。您也可以使用ui-ruoter的解決方案。

UPDATE:

奇怪迭代是一個已知的問題與UI的ruoter。你可以在SO上檢查這個question

可以更改,否則這樣的,它的工作原理:

$urlRouterProvider.otherwise(function ($injector, $location) { 
    var $state = $injector.get("$state"); 
    $state.go("intro"); 
}); 

我知道這是不是很優雅,但它的作品至少人。
更新plunker

+0

感謝您的答案,但我的介紹就像'app.intro',並有url'/ intro /幻燈片'這導致了奇怪的迭代。你知道爲什麼嗎?上面更新了問題。 –

+0

@HP .:檢查我的更新答案。乾杯。 – LeftyX

相關問題