Javascript 在Angular Service中使用$http-无法读取属性';邮政';未定义的
我正试图学习如何使用Angular right,将所有业务逻辑都放在服务中 在服务中执行post请求时,出现以下错误:Javascript 在Angular Service中使用$http-无法读取属性';邮政';未定义的,javascript,angularjs,dependency-injection,Javascript,Angularjs,Dependency Injection,我正试图学习如何使用Angular right,将所有业务逻辑都放在服务中 在服务中执行post请求时,出现以下错误: Cannot read property 'post' of undefined 下面是一些代码: UrlApp.controller('UrlFormCtrl', UrlFormCtrl); UrlApp.factory('addUrlService', addUrlService); function UrlFormCtrl($sc
Cannot read property 'post' of undefined
下面是一些代码:
UrlApp.controller('UrlFormCtrl', UrlFormCtrl);
UrlApp.factory('addUrlService', addUrlService);
function UrlFormCtrl($scope, $http) {
console.log('Url Form Controller Initialized');
$scope.addUrl = addUrlService.bind(null, $http);
}
function addUrlService($scope, $http){
console.log('initializing addUrlService');
return $http.post('urls/create', {'test':'test'}).then(function(response){
return response.data;
});
}
我只是掌握了角度的窍门,所以我不完全确定我做错了什么。看到问题了吗?首先,您不需要在服务中注入
$scope
Can you try like this
UrlApp.controller('UrlFormCtrl', UrlFormCtrl);
UrlApp.factory('addUrlService', addUrlService);
function UrlFormCtrl($scope,addUrlService) {
console.log('Url Form Controller Initialized');
$scope.addUrl = addUrlService;
}
function addUrlService($http){
console.log('initializing addUrlService');
return $http.post('urls/create', {'test':'test'}).then(function(response){
return response.data;
});
}
其次,您不需要在控制器中注入$http
服务
第三,您需要在控制器中注入服务
最后,addUrlService
服务返回一个承诺,意思是在实例化服务时它将发出请求。您可能希望返回一个函数或包含多个函数的对象
因此,我将您的代码更改为:
UrlApp.controller('UrlFormCtrl', UrlFormCtrl);
UrlApp.factory('AddUrlService', AddUrlService);
function UrlFormCtrl($scope, AddUrlService) {
$scope.addUrl = AddUrlService.addUrl;
}
function AddUrlService($http) {
function addUrl() {
return $http.post('urls/create', {
'test': 'test'
}).then(function (response) {
return response.data;
});
}
return {
addUrl: addUrl
};
}
您可以将依赖注入(或di)添加到问题标签中,因为这是相关的。谢谢,一个服务应该用于一个控制器还是多个控制器?假设我有一个控制器处理表单,另一个控制器在表中列出。使用一个全方位的UrlService是合适的还是两个?@kinx您应该尽可能使服务可重用。angular中的服务在应用程序中作为单例工作,因此当我希望应用程序中的多个模块使用一个服务时,我会将其设置为无状态。我不知道您的应用程序,但此服务可以是一个通用的
UrlService
(而不是AddUrlService
),它是管理某些数据库中URL的CRUD。因此,它可以被任何控制器、服务使用。谢谢,@Letiagolves,最后一个问题:最后一个return语句,我知道它返回了一个json对象,但是,你在这里做的事情:addUrl:addUrl真的让我困惑,因为你只是重复了两次。介意解释一下吗?@kinx你说得对。它正在返回一个文本对象
。该对象有一个名为addUrl
的属性,该属性引用函数addUrl
。我为函数和对象属性指定了相同的名称,但您不需要这样做。如果需要,可以更改函数名和属性名。例如:add:addUrl
。但是,如果您更改属性名称,请不要忘记在控制器中也进行更改。您好,当我需要在ng单击后运行服务时,这似乎会在页面加载上运行。