更改离子视图后,Meteor订阅不会停止

时间:2016-05-20 14:30:19

标签: javascript angularjs meteor ionic-framework angular-meteor

我将Angular-MeteorIonic一起使用。

Meteor版本:1.3.2.4,Angular版本:1.5.5,离子版本:1.2.4

我也在使用ES2015作为我的Meteor / Angular应用程序。

我有一个观点:

import angular from 'angular';
import angularMeteor from 'angular-meteor';
import uiRouter from 'angular-ui-router';

import { Meteor } from 'meteor/meteor';
import { SomeCollection } from 'path/to/collection';

import './view1.html';

class View1 {
  constructor($scope, $reactive, $state) {
    this.$state = $state;

    this.$scope = $scope;

    $reactive(this).attach($scope);

    this.subscribe('my.subscription');

    this.helpers({
      list: () => {
        return SomeCollection.find({});
      }
    });
  }
}

export default angular.module('view1', [
  angularMeteor,
  uiRouter,
  View1
]).config(config);

function config($stateProvider) {
  'ngInject';

  $stateProvider.state('app.view1', {
    url: '/view1',
    template: '<view-1></view-1>',
    views: {
      'appContent': {
        controller: View1,
        controllerAs: 'view1',
        templateUrl: 'path/to/template.html'
      }
    }
  });
}

另一种观点我有类似的设置,但我订阅了不同的出版物。

类似的东西:

import angular from 'angular';
import angularMeteor from 'angular-meteor';
import uiRouter from 'angular-ui-router';

import { Meteor } from 'meteor/meteor';
import { SomeOtherCollection } from 'path/to/other/collection';

import './view2.html';

class View2 {
  constructor($scope, $reactive, $state) {
    this.$state = $state;

    this.$scope = $scope;

    $reactive(this).attach($scope);

    this.subscribe('my.other.subscription');

    this.helpers({
      list: () => {
        return SomeOtherCollection.find({});
      }
    });
  }
}

export default angular.module('view2', [
  angularMeteor,
  uiRouter,
  View2
]).config(config);

function config($stateProvider) {
  'ngInject';

  $stateProvider.state('app.view2', {
    url: '/view2',
    template: '<view-2></view-2>',
    views: {
      'appContent': {
        controller: View2,
        controllerAs: 'view2',
        templateUrl: 'path/to/other/template.html'
      }
    }
  });
}

当我在我的Ionic视图之间切换时,我注意到我仍然从先前视图的订阅中进行轮询。根据文档,如果我使用$scope,则应自动调用stop()函数。

但是,我可以看到使用Mongol我的订阅没有停止切换视图。

我目前能够使用快速解决方案,但它很丑陋,并强制使用我认为不必要的解决方法来填充我的代码,即:

$scope.$on('$ionicView.enter', () => {
  this.subscriptions = [];
  this.subscriptions.push(this.subscribe('some.collection'));
  this.subscriptions.push(this.subscribe('some.other.collection'));
});

$scope.$on('$ionicView.leave', () => {
  for (var sub in this.subscriptions) {
    this.subscriptions[sub].stop();
  }
});

我做错了什么?在Ionic视图之间切换时如何正确停止订阅?

1 个答案:

答案 0 :(得分:0)

默认情况下,Ionic缓存控制器/视图,因此我的范围没有被销毁,因此在视图之间切换时,stop()函数没有被调用。

要解决此问题,我只需在cache: false上设置$stateProvider,这就解决了我的问题。

但是,我确实认为我喜欢我的观点被缓存所以我想我会想出一个很好的方法来停止订阅时切换视图但保持cache: true ...任何优雅的想法都是欢迎。