我想在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);
});
}
};
});
答案 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
指针增加了很多复杂性和错误空间。程序员应该讨厌两件事。这就是为什么我推荐我提到的第一种方法。