Meteor和AngularJS被动订阅

时间:2014-11-23 19:13:26

标签: angularjs meteor

我的出版物依赖于客户的参数。因此,在从客户端订阅时,我需要将此参数发送到服务器。 我使用angular-meteor包并找到$subscribe包装器。 用法如下:$subscribe.subscribe(name, publisherArguments) 我试图将动态$ scope值传递给订阅但它似乎不起作用。例如,以下示例从不警告"您订阅了!"

   $subscribe.subscribe('aPublication',$scope.parameter).then(function(){
         alert("You subscribed !");
  });

假设服务器端看起来像这样

  Meteor.publish("aPublication", function (parameter) {
    ACollection.find({'aProperty':'parameter'}) });

我应该怎样做才能使$scope.parameter的工作方式与我使用Session.get('parameter')的方式相同?

2 个答案:

答案 0 :(得分:1)

这是我的工厂,它确实具有这种形状,因为我将它绑定到

   angular.module('myApp.controllers').factory('items', function () {

        var listOfItems = [
            {name: "one"},
            {name: "two"},
            {name: "three"}];

        var currentItem = listOfItems[1];

        return {
            'list': listOfItems,
            'current': currentItem
        };
    });

接下来是我的控制器,我基本上会关注cities.current值的更改,然后触发将使用正确参数订阅的currentItemChanged函数。

angular.module('myApp.controllers').controller("MyCtrl", ['$scope', 'items', '$subscribe',
    function ($scope, items, $subscribe) {

            $scope.$watch(function () {
                return cities.current;
            }, function (currentItem)
            {
                currentItemChanged(currentItem.name);
            }, true);

            function currentCityChanged(itemName)
            {
                // resubscribe to the right set of
                $subscribe.subscribe('anItemsSubscription', itemName).then(function ()
                {

                });
            }

答案 1 :(得分:1)

@Flavien Volken,这是一个非常好的解决方案,但在我们新的0.6.0版本中,您也可以使用与Meteor方式类似的解决方案,使用scope.getReactively - http://angularjs.meteor.com/api/getReactively

所以在你的解决方案中:

$meteorUtils.autorun($scope, function() {      
   $meteorSubscribe.subscribe('aPublication',
                              $scope.getReactively('parameter'))
                             .then(function(){
                                  alert("You subscribed !");
      });
});