在其他一些范围内执行角度服务?

时间:2015-07-12 08:00:22

标签: javascript angularjs scope socket.io angular-services

我正在使用AngularSocket.IO设计实时系统。

我使用两个不同的工厂用于订阅主题,另一个用于为其回调函数编写逻辑并在那里订阅它。

  

pubsub.js

app.factory('PubSub', function(){
   return{
     subscribe: function(event, callback){ 
        socket.on(event, callback);
      }, //end subscribe
   }
})
  

orders.js

app.factory('Orders', function(PubSub){
   return{
      subscribeOrderUpdate : function(){
        //Subscribing 
        PubSub.subscribe('onUpdateOrder', this.onOrderUpdate);
      },

      //Callback function
      onOrderUpdate: function(order){
        var result = this.findOrder(order.Id);
        console.log('Order has been updated');
      },

      findOrder(OrderId){
         //logic to find order based on orderId
      }

   };
});

现在当我从我的控制器中调用它时

//Controller..
app.controller('OrdersPage', function($scope, Orders){
   Orders.subscribeOrderUpdate(); 
   /* Shows Error this.findOrder() is not a function*/
});

现在,当我调用此工厂时,显示错误this.findOrder不是函数。

搜索后我发现自从我的回调函数onOrderUpdate 正在调用PubSub工厂范围,因此显示错误,因为this.findOrderOrders工厂范围内定义。

那么我应该如何定义它以便在正确的范围内调用this.findOrder

1 个答案:

答案 0 :(得分:1)

尝试将您的订单服务重新分解为类似..

app.factory('Orders', function(PubSub){

  var service = {
    subscribeOrderUpdate  : subscribeOrderUpdate
  };

  return service;
  //////////////////////////////

  function subscribeOrderUpdate(){
    //Subscribing 
    PubSub.subscribe('onUpdateOrder', onOrderUpdate);
  }

  function onOrderUpdate(order){
    var result = findOrder(order.Id);
    console.log('Order has been updated');
  }

  function findOrder(OrderId){
     //logic to find order based on orderId
  }

});

如果您需要直接在其他任何地方使用findOrder方法,可以像subscribeOrderUpdate方法一样使用onOrderUpdate方法,但它看起来不像您需要,因此我将其与{{{{{}}一起删除1}}。最好只展示你需要的东西。