如何从函数内引用对象属性,该函数也是服务工厂中的对象属性

时间:2015-09-08 05:29:25

标签: javascript angularjs

我想在getAllProducts成功回调中调用addProduct方法,但它显示getAllProducts is not defined

  'use strict';

ProductBuilder.factory('productBuilderService', function ($http, secKey, urlContent) {
    return {

        getAllProducts: function ($scope) {
            $http.get(urlContent + '/api/Products')
                    .success(function (response) {
                        $scope.products = response;
                    });
        },

        addProduct: function ($scope) {
            var data = {
                "action": "post",
                "product":
                    {
                        "ID": $scope.ID,
                        "Name": $scope.Name,
                        "Section": $scope.Section
                    }
            }

            $http({
                url: urlContent + '/api/Products',
                method: "POST",
                data: data
            }).success(function (response) {
                getAllProducts($scope);
            });
        },

        deleteProductByID: function (id, $scope) {
            var data = {
                "action": "delete",
                "rule":
                    {
                        "ID": id,
                        "Name": $scope.Name,
                        "Section": $scope.Section
                    }
            }

            $http({
                url: urlContent + '/api/Products',
                method: "POST",
                data: data
            }).success(function (response) {
                getAllProducts($scope);
            });
        }
    };
});

1 个答案:

答案 0 :(得分:2)

getAllProducts是您要返回的对象的属性,而不是您可以自己调用的局部变量。我建议您先创建对象,然后将其返回。这样,您就可以引用它所属的对象。

var myObj = {
  getAllProducts: function() { //etc
  anotherFunction: function() {
     //etc
     myObj.getAllProducts();

  }
};
return myObj;

另一种选择是首先使该函数,然后将其存储到对象:

function getAllProducts() { //etc } // local variable
return {
  getAllProducts: getAllProducts, // assign the local variable to the object
  anotherFunction: function() {
    getAllProducts(); // now you can call the local variable
  }
}

您还可以使用对象内的this指针来引用该对象的其他属性,但我建议避免使用this指针。 this的值会根据您使用它的位置和时间而变化。

假设上下文(this的值)尚未更改,那么this.getAllByProducts()将引用您正在返回的对象上的属性getAllProducts作为该对象属性的函数。但是,在您拨打getAllProducts的特定位置,this的值由$http调用设置,不再引用您的对象。这意味着您必须将this的值缓存到变量,同时引用您的对象并使用该变量:

return {
  getAllProducts: function() { //etc }
  anotherFunction: function() {
    var that = this;
    // later
    that.getAllProducts();
  }
};

即使缓存this指针,其值仍可在此时更改,因为函数的上下文可以通过bind, apply, and call等方法更改。 this指针增加了很多复杂性和错误空间。程序员应该讨厌两件事。这就是为什么我推荐我提到的第一种方法。