Javascript AngularJS:从控制器调用服务函数时出错
我将在这里描述的错误似乎很常见;我在网上读了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是AngularJS新手 我设计了一个服务,它的唯一作用是检索资源并返回它:Javascript AngularJS:从控制器调用服务函数时出错,javascript,angularjs,Javascript,Angularjs,我将在这里描述的错误似乎很常见;我在网上读了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是AngularJS新手 我设计了一个服务,它的唯一作用是检索资源并返回它: myApp.service('htmlGettersService', function ($http, $sce, $q) { this.getHtmlIsa = function (codice_isa) { return { console.log
myApp.service('htmlGettersService', function ($http, $sce, $q) {
this.getHtmlIsa = function (codice_isa) {
return {
console.log("Get HTML Isa...");
var req = {
method: 'GET',
url: '/' + appName + '/api/quadri/' + codice_isa,
headers: {
'Content-Type': 'text/html;charset=UTF-8'
}
};
var htmlQuadri = {};
var deferred = $q.defer();
$http(req).then(function (response) {
htmlQuadri = $sce.trustAsHtml(response.data);
console.log("HTML Isa acquisito correttamente");
}, function (response) {
console.log("Errore in Get HTML Isa..." + response.message);
htmlQuadri = ("Errore in Get HTML Isa..." + response.message).promise;
});
deferred.resolve(htmlQuadri);
console.log("Exit from service function");
// return htmlQuadri;
return deferred.promise;
};
}
});
在这种情况下,我必须插入延迟策略,因为服务函数似乎在GET调用(以及success/failure函数)完成工作之前终止。
其次,我尝试从控制器调用服务函数:
$scope.getHtmlIsa = function () {
htmlGettersService.getHtmlIsa($scope.codice_isa).then(function (response) {
$scope.htmlQuadri = response.data;
});
console.log("Controller: exit from getHtmlIsa");
}
最后,我得到以下错误:
angular.js:14525 TypeError: Cannot read property 'then' of undefined
at ChildScope.$scope.getHtmlIsa (quadriController.js:51)
at Object.<anonymous> (quadriController.js:120)
at Object.invoke (angular.js:5003)
at $controllerInit (angular.js:10866)
at nodeLinkFn (angular.js:9746)
at compositeLinkFn (angular.js:9055)
at publicLinkFn (angular.js:8920)
at Object.link (angular-route.js:1223)
at angular.js:1346
at invokeLinkFn (angular.js:10426) "<ng-view class="ng-scope">"
angular.js:14525类型错误:无法读取未定义的属性“then”
在ChildScope.scope.getHtmlIsa(quadriController.js:51)
反对。(quadriController.js:120)
在Object.invoke(angular.js:5003)
在$controllerInit(angular.js:10866)
在nodeLinkFn(angular.js:9746)
在复合线kfn(angular.js:9055)
在publicLinkFn(angular.js:8920)
在Object.link(angular route.js:1223)
在angular.js:1346
在invokeLinkFn(angular.js:10426)”处
我也尝试在赛德控制器中使用同样的延迟策略;上面报告的错误消失了,但似乎控制器函数在服务函数返回任何内容之前终止,所以没有足够的时间将来自服务的响应保存在控制器变量中。
有线索吗?
感谢您的帮助。
此。getHtmlIsa
应返回承诺,以便在控制器中解决此问题(即.then()
)
但是,在您的情况下,您返回的对象返回的Promise语法也错误:
return {
//...
return deferred.promise;
}
当然这不是你想做的
另外,使用
延迟
也不是好的做法。请看这个
因此,正确的语法应该是:
myApp.service('htmlGettersService', function($http, $sce, $q)
{
this.getHtmlIsa = function(codice_isa)
{
console.log("Get HTML Isa...");
var req =
{
method: 'GET',
url: '/'+appName+'/api/quadri/' + codice_isa,
headers:
{
'Content-Type': 'text/html;charset=UTF-8'
}
};
var htmlQuadri = {};
return $http(req).then(function(response){
htmlQuadri = $sce.trustAsHtml(response.data);
console.log("HTML Isa acquisito correttamente");
return htmlQuadri;
}, function(response){
console.log("Errore in Get HTML Isa..."+response.message);
htmlQuadri = ("Errore in Get HTML Isa..."+response.message).promise;
return htmlQuadri;
});
}
});
您的代码无法读取,抱歉,谢谢您的回答。我读了很多关于使用外部回报的帖子:有些人使用,有些人不使用。一开始我没有用过它,后来我又加上了它,因为我已经看过很多次了。因为我是AngularJS的新手,所以我对语法有很多疑问。你能明确地告诉我我错在哪里吗?@Bia我想你混淆了
工厂的语法:)这里我们谈论服务方法对不起,这篇乱七八糟的帖子,我在工作中被分配了一项任务,我没有时间好好学习这个主题(书籍、示例、教程、练习)。我会利用你的建议,让你知道