2015-04-14 66 views
0

我有一個包含三個選項卡的選項卡式界面的應用程序。當用戶對tab1執行某些操作時,它會動態地創建出現在第二個選項卡上的元素。問題是當我嘗試在我的javascript中動態創建該內容時,我得到的不能設置「null」屬性,我假設這是因爲第二個選項卡尚未加載到dom中。如果我先導航到第二個選項卡,然後回到第一個選項卡,它工作正常。我沒有真正使用它通常使用的方式。一切都在JavaScript中完成。我只是爲底層UI準備了一個準系統app.js。在應用程序啓動時將所有選項卡加載到DOM上(使用Ionic)

本質上,我只想在應用程序啓動時將所有三個選項卡加載到DOM中,以便可以從任何其他選項卡動態修改任何選項卡的內容。不知道如何做到這一點。這裏是我的app.js是什麼樣子:

VAR對myApp = angular.module( '啓動',[ '離子', 'ngCordova'])

myApp.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if(window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    } 
    if(window.StatusBar) { 
     StatusBar.styleDefault(); 
    } 

    $cordovaStatusbar.overlaysWebView(true) 
    $cordovaStatusbar.styleHex('#4a87ee') 
    $ionicConfigProvider.views.forwardCache(true); 
    }); 
}); 

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

    $stateProvider 
    .state('tabs', { 
     url: "/tab", 
     abstract: true, 
     templateUrl: "templates/tabs.html" 
    }) 

    .state('tabs.home', { 
     url: "/home", 
     views: { 
     'home-tab': { 
      templateUrl: "templates/home.html" 
     } 
     } 
    }) 

    .state('tabs.favorites', { 
     url: "/favorites", 
     views: { 
     'favorites-tab': { 
      template: "templates/favorites.html", 
      controller: 'AppCtrl' 
     } 
     } 
    }) 

    .state('tabs.settings', { 
     url: "/settings", 
     views: { 
     'settings-tab': { 
      templateUrl: "templates/settings.html" 
     } 
     } 
    }); 


    $urlRouterProvider.otherwise("/tab/home"); 

}) 

myApp.controller('AppCtrl', function($scope) { 

}) 

我的基本的應用程序結構/ HTML看起來像這樣的:

<ion-nav-bar class="bar-positive"></ion-nav-bar> 

<ion-nav-view></ion-nav-view> 

<script id="templates/tabs.html" type="text/ng-template"> 
    <ion-tabs class="tabs-positive tabs-icon-only"> 

    <ion-tab title="Videos" icon-on="ion-ios-home" icon-off="ion-ios-home-outline" href="#/tab/home"> 
     <ion-nav-view name="home-tab"></ion-nav-view> 
    </ion-tab> 

    <ion-tab title="Favorites" icon-on="ion-ios-star" icon-off="ion-ios-star-outline" href="#/tab/favorites"> 

     <ion-nav-view name="favorites-tab"></ion-nav-view> 
    </ion-tab> 

    <ion-tab title="Settings" icon-on="ion-ios-gear" icon-off="ion-ios-gear-outline" href="#/tab/settings"> 
     <ion-nav-view name="settings-tab"></ion-nav-view> 
    </ion-tab> 

    </ion-tabs> 
</script> 

<!-- **************************** HOME TAB **************************** --> 
<script id="templates/home.html" type="text/ng-template"> 
    <ion-view view-title="Lmao!Tube"> 

     <ion-content has-bouncing="true" overflow-scroll="true" class="iframe-wrapper"> 

      <div id="videoList"> </div> 

     </ion-content> 

    </ion-view> 
</script> 

<!-- **************************** FAVORITES TAB **************************** --> 
<script id="templates/favorites.html" type="text/ng-template"> 
    <ion-view view-title="Favorites" > 

     <ion-content has-bouncing="true" overflow-scroll="true" class="iframe-wrapper"> 

      <div id="favoriteList"></div> 

     </ion-content> 

    </ion-view> 

</script> 

<!-- **************************** SETTINGS TAB **************************** --> 
<script id="templates/settings.html" type="text/ng-template"> 
    <ion-view view-title="Settings"> 

     <ion-content> 

     </ion-content> 

    </ion-view> 
</script> 

+0

是的,我不認爲這就是它通常使用的方式。每個標籤內容結構的變化應該可以保存爲服務中的數據,然後通過您的控制器訪問,以根據他們以前的操作動態顯示內容。例如,他們點擊home,家庭控制器將數據保存到「GlobalService」,您將GlobalService傳遞到您的收藏夾控制器中,並根據GlobalService中的值更改該選項卡的內容。那有意義嗎?一旦我更好地瞭解你在做什麼,我會給出答案。 – DataHerder

+0

恩,不是。我根本不太熟悉Ionic。我所有的應用邏輯都是javascript。我只是在使用Ionic,因爲它是我所需的所有UI組件都可以找到的唯一框架,而無需跳過這些環節並繞過我的$ $$來到我的胳膊肘。 –

+0

糟糕...基本上我在主屏幕上加載了YouTube視頻。有一個選項/按鈕可將視頻添加到收藏夾。當用戶點擊添加到收藏夾時,它會進入收藏夾陣列,並將視頻加載到收藏夾選項卡中。通過邏輯工作正常,除了我必須先導航到第二個選項卡。 –

回答

1

其實重讀你的問題後,你想幹什麼我用不同的方式。一旦你點擊了選項卡,它將被放置在堆棧上並呈現內容,這就是爲什麼它只在你前後推動時才起作用。更好的方法是使用AngularJS和應用程序框架,通過在服務中保存布爾值等更改。服務是一個實例化對象的對象,用於保存信息並將其從控制器傳遞給控制器​​。您可以使用該服務來保存控制器動態地創建內容的價值觀,並在您的模板,你可以使用AngularJS的指令,像ng-showng-if等等

比如在services.js你可以有:

angular.module('starter.services', []) 
    .service('MyService', function() { 
     var Stuff = {}; 
     this.set = function(key, value) { 
      Stuff[key] = value; 
     }; 
     this.get = function(key) { 
      return Stuff[key]; 
     } 
    }); 

並在家裏控制器

.controller('HomeCtrl', function(MyService, $scope) { 
    MyService.set('home', true); 
}) 

而且在您的收藏夾控制器

.controller('FavCtrl', function(MyService, $scope) { 
    if (MyService.get('home') === true) { 
     // set a variable or return list or query or whatever you want 
     // lets say it's an array 
     $scope.list = [1,2,3]; 
    } else { 
     $scope.list = [4,5,6]; 
    } 
}) 

且模板中,你可以這樣做:

<div ng-repeat="i in list"> 
    {{i}} 
</div> 

,並應打印出1 2 3,如果他們點擊主頁選項卡,和4 5 6如果不是。

如果你是新來的角度去這裏:http://campus.codeschool.com/courses/shaping-up-with-angular-js/intro?utm_source=google&utm_medium=cpc&utm_campaign=course&gclid=CjwKEAjw9bKpBRD-geiF8OHz4EcSJACO4O7TsJ3Mx9m9DOH47-6rmFshzUkkkHzJFhJcNiPl1it9JRoCN_fw_wcB

非常漂亮當然,讓你知道關於AngularJS相當快與離子合作一些事情。離子是一個偉大的框架。

+0

看起來很漂亮,但我不知道這意味着什麼......就像我說的,我的應用程序是用javascript編寫的,而不是角度。我純粹將Ionic用於UI組件。而且我不想重寫我的整個應用程序。如果像DOM操作這樣基本的操作很複雜,我會拋棄Ionic並進入一個更易於使用的框架。在我嘗試過的其他所有框架中都非常簡單,除了Ionic出於某種原因外,我假設它是與Angular緊密集成的。 –

+0

是的,它與angular非常緊密地結合在一起,angularjs是javascript,但我想我明白你的意思。除了更大的應用程序之外,您正在將此用於某個側面項目。如果你不太瞭解角度或離子(如果你對我剛纔所說的話不瞭解,那麼顯然你不瞭解),那麼A)你最好學習更多關於它的知識,或者B)跳過這一切一起。 Ionic是在Angular之上撰寫的,因爲它是基礎框架,使用離子技術至少需要對Angular有一個基本的理解。 – DataHerder

+1

感謝您的詳細解釋。我認爲它確實回答了這個問題,並且超越了這個問題。 –

相關問題