为什么在同一个集合上调用不同的订阅会导致流星错误?

时间:2015-11-02 16:46:18

标签: angularjs meteor angular-meteor

我正在研究angular-meteor tutorial step 12 我有一个问题

  

停止订阅主题

你可以使用“meteorSubscribe”

来使用ctrl + f

然后关于该主题的关键句是

  

原因是我们在partyDetails控制器内的同一个集合上调用了不同的订阅。

修正前的代码是

$scope.party = $meteor.object(Parties, $stateParams.partyId).subscribe('parties');
$scope.users = $meteor.collection(Meteor.users, false).subscribe('users');

然后纠正

$scope.party = $meteor.object(Parties, $stateParams.partyId);
$scope.users = $meteor.collection(Meteor.users, false).subscribe('users');
$scope.$meteorSubscribe('parties');

我尝试在更正代码之前运行并且在cmd中没有显示任何内容(错误),但它只会导致错误的结果,如教程所说

  

如果您导航到聚会详细信息页面然后返回,则分页和搜索将停止工作。

然后我有两个问题

  1. 为什么cmd上没有显示错误?
  2. 为什么来自partyDetails控制器的错误会影响到partyList控制器搜索和分页?他们的关系是什么?

1 个答案:

答案 0 :(得分:2)

编辑:如果你没有取消订阅,那么如果你离开并再次返回,你将最终尝试两次订阅同一个出版物,从而导致错误,因为meteor中的订阅会持续到你结束它们为止。

有两种方法可以摆脱角度流星的订阅。您可以为订阅分配一个句柄变量,然后在离开页面时可以停止它。两个(建议的方式)是使用$scope.$meteorSubscribe而不是$meteor.subscribe(),因为它被设置为在范围被销毁时自动删除订阅。

我无法看到你的所有代码都知道你为什么或者没有得到你认为你应该犯的错误,希望这能够解释教程中发生的事情。

最终的结果将是:

$meteor.autorun($scope, function() {
    $meteor.subscribe('parties', {
        limit: parseInt($scope.perPage),
        skip: parseInt(($scope.page - 1) * $scope.perPage),
        sort: $scope.sort
    }).then(function() {
        $scope.partiesCount = $meteor.object(Counts, 'numberOfParties', false);
        $scope.parties = $meteor.collcetion(function() {
            return Parties.find({}, {
                sort: $scope.getReactively('sort');
            });
        });
    });
});

请注意,他也在更改服务器上的发布功能。有助于理解您是否单击链接以显示git差异。