Angular, функция вызова вызова из текущей службы
У меня есть служба под названием sharedData с некоторыми функциями, как вызвать одну из этих функций из других таких функций? здесь код (отмеченные проблемы с функцией "???????" ): Спасибо
service('sharedData', function ($http) {
var refillList = [];
var orderCart = {
orderPlace: null,
orderList: [],
totalSum: 0
};
return {
....
addRefill: function(value) {
...here some logic....
},
addOrder: function(order) {
...here some logic....
},
sendOrder: function(order, refill) {
$http.get(config.urls.ajaxOrder + "{\"order\":{\"table_id\":" + orderCart.orderPlace + ",\"item_id\":" + order.id + ",\"amount\":1,\"action\":1}}").success(function(dataDetails) {
if (dataDetails.success) {
if (refill == 1) {
// Filling refill list
??????????????????this.addRefill(order);?????????
}
// Filling order cart
?????????this.addOrder(order);?????????????
}
});
}
};
}).
Ответы
Ответ 1
Вы должны сохранить ссылку на this
.
var self = this;
является обычной практикой.
sendOrder: function(order, refill) {
var self = this;
$http.get(config.urls.ajaxOrder + "{\"order\":{\"table_id\":" + orderCart.orderPlace + ",\"item_id\":" + order.id + ",\"amount\":1,\"action\":1}}")
.success(function(dataDetails) {
if (dataDetails.success) {
if (refill == 1) {
// Filling refill list
self.addRefill(order);
}
// Filling order cart
self.addOrder(order);
}
}
});
}
Обновление 2016
Теперь, используя ES6, вы можете использовать функции стрелок следующим образом:
sendOrder: function(order, refill) {
$http.get(config.urls.ajaxOrder + "{\"order\":{\"table_id\":" + orderCart.orderPlace + ",\"item_id\":" + order.id + ",\"amount\":1,\"action\":1}}")
.success(dataDetails => {
if (dataDetails.success) {
if (refill == 1) {
// Filling refill list
this.addRefill(order);
}
// Filling order cart
this.addOrder(order);
}
}
});
}
Функции стрелок не изменяют контекст, поэтому this
будет тем же самым this
.
Статья MDN о функциях стрелок
Ответ 2
Проблема в том, что это в этой функции обратного вызова относится к родительскому контейнеру обратного вызова, который в этом случае равен $http. То, что вы хотите сделать, это создать экземпляр родительского объекта за пределами обратного вызова и ссылки, которые находятся внутри обратного вызова.
Что-то вроде:
....
{
....
addRefill: function(value) {
...here some logic....
},
addOrder: function(order) {
...here some logic....
},
sendOrder: function(order, refill) {
var rootObj = this;
$http.get(config.urls.ajaxOrder + "{\"order\":{\"table_id\":" + orderCart.orderPlace + ",\"item_id\":" + order.id + ",\"amount\":1,\"action\":1}}").success(function(dataDetails) {
if (dataDetails.success) {
if (refill == 1) {
// Filling refill list
rootObj.addRefill(order);
}
// Filling order cart
rootObj.addOrder(order);
}
});
}
};
....
Это, конечно, просто решение, но основная концепция, которую следует иметь в виду, состоит в том, что функция вызывается из обещания успеха не от вашего объекта.