2015-10-27 39 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()来代替,但在我看来,应用更好。

相关问题