Ответ 1
в функции SOAPClient._getElementsByTagName
Я меняю линию return document.getElementsByTagName(tagName);
Для return document.getElementsByTagNameNS("*", tagName);
работайте для меня!
Я использую мыльную услугу для AngularJS от Andrew McGivery
Он отлично работает при вызове из Chrome, но он возвращает typeError в Firefox и IE11.
TypeError: e имеет значение null в строке angular.soap.js 16
Этот код выглядит следующим образом:
.factory("$soap",['$q',function($q){
return {
post: function(url, action, params){
var deferred = $q.defer();
//Create SOAPClientParameters
var soapParams = new SOAPClientParameters();
for(var param in params){
soapParams.add(param, params[param]);
}
var soapCallback = function(e){
//ERROR THROWN ON LINE BELOW
if(e.constructor.toString().indexOf("function Error()") != -1){
deferred.reject("An error has occurred.");
} else {
deferred.resolve(e);
}
}
SOAPClient.invoke(url, action, soapParams, true, soapCallback);
return deferred.promise;
},
setCredentials: function(username, password){
SOAPClient.username = username;
SOAPClient.password = password;
}
}
}]);
e в Chrome - это объект, возвращаемый моей веб-службой (пользовательский объект), в Firefox это null, и я не знаю, где искать библиотеку для отладки проблемы.
UPDATE:
Мой контроллер выглядит следующим образом:
.controller('SoapCtrl', function($soap) {
this.login = function(credentials) {
$soap.post('MYAPI', 'MYMETHOD', {login: credentials.login, password: credentials.password}).then(function(data) {
console.log(data.userid);
});
}
})
Я также попытался вызвать тот же web-сервис из плагина jquery jquery.soap внутри моего приложения angular, и я получаю ожидаемое поведение в как Chrome, так и Firefox.
ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ
Поскольку это профессиональный проект, мы решили перейти к плагину, который работает. jquery.soap
2 вопроса были опубликованы на странице автора без ответа на данный момент.
Я бы присвоил награду правильному ответу, но половина щедрота автоматически переходит к ответу с 2 upvotes...
в функции SOAPClient._getElementsByTagName
Я меняю линию return document.getElementsByTagName(tagName);
Для return document.getElementsByTagNameNS("*", tagName);
работайте для меня!
В библиотеке проверьте файл soapclient.js, на строке 195
SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req)
{
var o = null;
var nd = SOAPClient._getElementsByTagName(req.responseXML, method + "Result");
if(nd.length == 0)
nd = SOAPClient._getElementsByTagName(req.responseXML, "return"); // PHP web Service?
if(nd.length == 0)
{
if(req.responseXML.getElementsByTagName("faultcode").length > 0)
{
if(async || callback)
o = new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
else
throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
}
}
else
o = SOAPClient._soapresult2object(nd[0], wsdl);
if(callback)
callback(o, req.responseXML);
if(!async)
return o;
}
если вы скажете, что в firefox значение e
это null
, потому что в этом методе переменная o
никогда не устанавливается. Отладка этого метода будет полезной.