2015-10-27 81 views
1

我有一個使用側欄的Ionic應用程序。在這個側邊欄中,有一些功能可以刷新您的數據,並將這些數據發送到服務器並返回一個新的JSON對象,並將其保存到本地存儲中。

我在這裏遇到的問題是,當您打開側邊菜單並點擊「刷新我的數據」菜單項時,數據的確會得到返回並保存在本地,但我還需要刷新或重新啓動,運行我所處的任何視圖/狀態的控制器,以便當前視圖可以使用存儲中的新數據。

我的index.html:

<ion-side-menu side="left" ng-controller="sidebarController"> 
    <ion-header-bar class="bar-positive"> 
     <h1 class="title">Menu</h1> 
    </ion-header-bar> 
    <div class="list has-header"> 
     <div class="item item-icon-left" ng-click="refreshData()"><i class="icon ion-refresh"></i> Refresh My Data</div>   
    </div> 
    </ion-side-menu> 

    <ion-side-menu-content> 
    <ion-nav-view></ion-nav-view> 
    </ion-side-menu-content> 

</ion-side-menus> 

正如你所看到的邊欄有它自己叫sidebarController專用控制器,你可以在這裏看到:

app.controller('sidebarController', ['$scope', '$ionicSideMenuDelegate', '$storage', '$registerService', '$ionicLoading', '$ionicPopup', 
    function($scope, $ionicSideMenuDelegate, $storage, $registerService, $ionicLoading, $ionicPopup) { 

    $scope.refreshData = function() { 

     // Display loading modal 
     $ionicLoading.show({ 
      template: 'Syncing with server...' 
     }); 

     // Call the getMemberDetails service 
     var memberNo = $storage.get('memberNo', ''); 
     $registerService.getMemberDetails(memberNo). 
     success(function(data, status, headers, config) { 

      // Store details to local storage 
      $storage.setObject('member', data.member); 

      // Close loading modal and sidebar 
      $ionicLoading.hide(); 
      closeSidebar(); 

      // Display success message 
      var alertPopup = $ionicPopup.alert({ 
       title: 'Success', 
       template: 'Your data hsa been successfully sycned.' 
      }); 

     }). 
     error(function(data, status, headers, config) { 

      $ionicLoading.hide(); 
      var alertPopup = $ionicPopup.alert({ 
       title: 'Oops', 
       template: 'An error occured while trying to sync with our servers. Please make sure you have a data connection.' 
      }); 

      // Close the sidebar 
      closeSidebar(); 

     }); 

    } 

    function closeSidebar() { 
     if ($ionicSideMenuDelegate.isOpenLeft()) { 
      $ionicSideMenuDelegate.toggleLeft(); 
     } 
    } 

    } 
]); 

所以基本上refreshData()後已經運行,我需要找出我目前處於哪個狀態或視圖,然後重新運行該視圖的控制器。有沒有一個簡單的方法來做到這一點?

+0

控制器不能「重新運行」。如果您想根據視圖不知道的更改更新視圖,則需要使用'$ broadcast'或'$ emit',或者完全重新加載視圖。 – Claies

回答

1

你這裏有兩種選擇:

  1. 廣播事件從sidebarController後的數據已 被成功同步,並添加邏輯控制器聽 該事件,並更新模型/視圖。
  2. 將您的數據(成員)存儲在服務中,並使不同的控制器對數據的引用相同。然後,Angular會通過更改檢測來照顧刷新視圖。

我會選擇兩項。由於您集中瞭如何將數據加載到負責提取數據的服務中的邏輯。控制器僅處理服務返回的數據。另外,刷新數據時只需向服務器發出一個請求。服務的

例子:

angular.facorty('Member', function($http) { 
 
    
 
    var items = []; 
 
    
 
    return { 
 
    
 
    items: items, 
 
    refresh: function() { 
 
     items.length = 0; // clear the items 
 
     return $http 
 
     .get(...) 
 
     .then(function(res) { 
 
      angular.forEach(res.data, function(item) { 
 
      items.push(item); 
 
      }); 
 
     }); 
 
    } 
 
    } 
 

 
}) 
 
.controller('sidemenuController', function(Member) { 
 
    // show loading here 
 
    Member.refresh().finally(/* hide loading */) 
 
}) 
 
.controller('MembersController', function($scope, Member) { 
 
    $scope.members = Member.items; 
 
    Member.refresh(); // additionally show some loading indication 
 
});

+0

根據你的應用程序,是的。我用「爲什麼」更新了答案。 – Stefan

+0

雖然只是一個快速的問題,所以說我去選擇2,我所有的控制器/視圖從中心點訪問數據 - 這很好。但是,在我更新服務中的數據後,是否會自動使用新數據自動刷新/更新視圖?我希望這是有道理的,我說... – Tiwaz89

+1

是的,只要你總是返回相同的引用到服務中的數據數組。 – Stefan

0

嘗試從控制器呼叫$route.reload()

0

AngularJS跟蹤您更改$scope當你正在運行的JS,除了兩個(可能更多,但兩個主要的)場景:
1.及時調用代碼(例如,通過setTimeout())。
2.代碼由事件運行時(角度無法預測)。

在這兩種情況下,你應該使用$scope.apply();觸發角的 「神奇引擎」 :)

簡單的例子:

function myJsonUpdated(jsonData){ 
    $scope.apply(function(){ 
     $scope.myscopeData... = jsonData... 
    }); 
} 

這個網站可能會有所幫助: AngularJS $watch() , $digest() and $apply() tutorial

旁註:你可以用$scope.digest()來代替,但在我看來,應用更好。

相關問題