Подтвердить что ты не робот

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);?????????????
                }
            });
        }
    };
}).
4b9b3361

Ответ 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);
            }
        });
    }
};
....

Это, конечно, просто решение, но основная концепция, которую следует иметь в виду, состоит в том, что функция вызывается из обещания успеха не от вашего объекта.