18

我有一些功能称为“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);?????????????
                }
            });
        }
    };
}).
4

2 回答 2

33

您应该保存对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 关于箭头函数的文章

于 2013-05-30T14:21:00.400 回答
3

问题是这个回调函数中的 this 指的是回调的父容器,在这种情况下是 $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);
            }
        });
    }
};
....

这当然只是一个解决方案,但要记住的主要概念是,该函数是从成功承诺中调用的,而不是从您的对象中调用的。

于 2013-05-30T14:34:01.193 回答