离子 - 如何使用$ ionicHistory.goBack()检测并将值传递回原始视图;

时间:2016-04-09 22:55:25

标签: list cordova ionic-framework parameter-passing back

使用ionic,我试图让一个用例从列表中选择并返回原始视图并带有一些值。除了检测到它已经返回到原始视图并将值传回原始视图之外,我已经完成了大部分工作。

到目前为止,我已经完成了以下任务:

按钮转到列表

var wallNormalAngle = wallAngle-PI/2; // assuming clockwise angle calculations
var differenceAngle = incidenceAngle - wallNormalAngle;
var reflectionAngle = incidenceAngle + 2 * differenceAngle

这是使用列表

转到新视图的触发器
    <button class="button button-block button-outline button-positive" ng-click="performselectUnit()"> Select Unit
    </button>
当按下对所选行执行操作时

带有列表的视图

$scope.performselectUnit = function(){
  console.log('performselectUnit');

  $state.go('app.units');
}

在选择行时,使用$ ionicHistory.goBack()返回原始视图

  <ion-item collection-repeat="unit in units" class="item item-icon-right item-icon-left" ng-click="selectUnit(unit.id)">

从最后一个函数开始,如何检测它返回到原始视图并传递一些值。

感谢。

更新: 我试过这个。

广播结果

  $scope.selectUnit = function(unit_id){
  console.log('performselectUnit:' + unit_id);

  $ionicHistory.goBack();
}

在原始视图控制器中捕获事件和结果。

  $scope.selectUnit = function(unit_id){
      console.log('performselectUnit:' + unit_id);

      $ionicHistory.goBack();
      $rootScope.$broadcast('selected-unit', { data: unit_id });


    }

但它从未在视图中更新

$rootScope.$on('selected-unit', function(event, args) {
    console.log("received selected-unit" + args.data);
    $scope.showSelectedUnit = args.data;
});

如何在视图中更新它?还是有更好的方法

3 个答案:

答案 0 :(得分:1)

面对完全相同的问题,我可以通过将调用顺序切换为goBack和广播来使其工作:

   $rootScope.$broadcast('selected-unit', { data: unit_id });   
   $ionicHistory.goBack();

答案 1 :(得分:0)

您可以使用pub-sub服务在两个ctrl之间共享信息

fiddle demo

function MyCtrl($scope, datasharer) {
 $scope.sharedData = datasharer.getSharedData();
 $scope.send = function() {
    datasharer.setSharedData($scope.name);    
 }
}

function My2Ctrl($scope, datasharer) {
  function getSendData(data) {
    console.log(data);
    $scope.sharedData = data;
  }

 datasharer.registerForSharedData(getSendData);
}

答案 2 :(得分:0)

使用$rootScope.$broadcast$rootScope.$on确实可以解决您的问题,只需在$scope.$apply中使用$rootScope.$on

$rootScope.$on('selected-unit', function(event, args) {
    console.log("received selected-unit" + args.data);
    $scope.$apply(function() {
      $scope.showSelectedUnit = args.data;
    });
});

更重要的是,$rootScope.$broadcast总是很昂贵,所以你可以试试$rootScope.$emit。有关角度事件的更多信息,请参阅https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/ 但更优雅的解决方案是使用Service在控制器之间共享数据,您可以参考Share data between AngularJS controllers