在其他范围内执行 angular 服务?

Executing angular services in some other scope?

我正在使用 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 不是函数的错误。

搜索后发现,由于我的回调函数onOrderUpdatePubSub 工厂范围内被调用因此显示错误,因为 this.findOrder 是在 Orders 工厂范围内定义的。

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

尝试将您的订单服务重构为类似...

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。最好只暴露你需要的。