我正在使用Angular
和Socket.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.findOrder
在Orders
工厂范围内定义。
那么我应该如何定义它以便在正确的范围内调用this.findOrder
。
答案 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}}。最好只展示你需要的东西。