Поле не сохраняется после отправки() в Интернете в Domino

Это связано с вопросом, который я разместил пару дней назад. Ответ там привел меня к поиску этой проблемы.

У меня есть следующий код в кнопке "Отправить"

if (validateFields(document.forms[0])==true){
    if (validateAdditionalFields(document.forms[0])==true){         
        document.getElementById("Status").value = "Submitted for RFP";      
        getRespParty('ResponsibleParty');                   
        document.forms[0].submit();
    }
}

У меня есть следующий код в функции getRespParty в JSHeader

function getRespParty(x) {
var noEmployees = document.getElementById('NoEmployees').value;
var stateName = document.getElementById('State').value  
var url = 'http://' + window.location.host + 
'/ebsprospects.nsf/(GetResponsiblePerson)?OpenAgent&NoEmployees=' + 
 noEmployees + '&State=' + stateName;     
var xhttp = new XMLHttpRequest();
xhttp.open("GET", url);
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {    
        document.getElementById(x).value = xhttp.responseText;  
    }
};
xhttp.send();
}

Агент (GetResponsiblePerson) заканчивается этим кодом (я выполняю серию dbLookups, чтобы вернуть конкретного человека, поэтому он должен быть в LS)

Dim nam As NotesName
Set nam = session.Createname(respParty)
Print "Content-type:text/plain"    
Print nam.Abbreviated

Поле ResponsibleParty является текстовым, видимым и редактируемым, а поле ID на вкладке HTML — ResponsibleParty. Когда код возвращается, в поле отображается имя, которое я ожидаю увидеть. Однако на самом деле он не сохраняет его, потому что документ на стороне клиента ничего не содержит в соответствующем поле ResponsibleParty. Кода в WQS нет. Поле ResponsibleParty в клиенте скрыто и доступно для редактирования, как и поле «Состояние», которое сохраняется, поэтому, по крайней мере, я знаю, что сохранение работает?

Почему значение поля, возвращаемое агентом, не сохраняется? Является ли тип логики вообще выполнимым или мне нужно сделать это по-другому?


person RoyRumaner    schedule 17.10.2018    source источник
comment
Привет, это может быть проблема времени. Ваш xmlhttp, вероятно, асинхронный. Поле обновляется после отправки страницы. Одним из решений может быть отправка формы в функции readystatechange...   -  person umeli    schedule 18.10.2018
comment
Невероятный! Это ответ. Большое спасибо за это.   -  person RoyRumaner    schedule 18.10.2018


Ответы (1)


Как сказал @umeli, это проблема времени. Вы вызываете getRespParty(), но как только вызывается XMLHttpRequest, код продолжает работу, выходит из функции и выполняет отправку до завершения вызова Ajax.

Одним из решений, которое ИМХО является более элегантным, было бы использование обратного вызова из getRespParty() и вызов отправки:

document.getElementById("Status").value = "Submitted for RFP";      
getRespParty('ResponsibleParty', function() { document.forms[0].submit() }); 

Затем вы изменяете getRespParty():

function getRespParty(x, callback) {
    var noEmployees = document.getElementById('NoEmployees').value;
    var stateName = document.getElementById('State').value  
    var url = 'http://' + window.location.host + 
    '/ebsprospects.nsf/(GetResponsiblePerson)?OpenAgent&NoEmployees=' + 
    noEmployees + '&State=' + stateName;     
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", url);
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {    
            document.getElementById(x).value = xhttp.responseText; 
            if (callback != null && typeof callback === "function") {
                callback();
            }
        }
    };
    xhttp.send();
}

Для еще большего улучшения вы можете вызывать функцию обратного вызова с разными аргументами, в зависимости от того, успешен XMLHttpRequest или нет:

if (this.readyState == 4) {
    if(this.status == 200) {    
        document.getElementById(x).value = xhttp.responseText; 
        if (callback != null && typeof callback === "function") {
            callback(true);
        }
    } else {
        if (callback != null && typeof callback === "function") {
            callback(true, this.status);
        }
    }
}

Теперь вы можете прочитать это значение и выполнить различные действия в своей основной функции обратного вызова:

document.getElementById("Status").value = "Submitted for RFP";      
getRespParty('ResponsibleParty', function(success, statusCode) { 
    if (success) {
        document.forms[0].submit();
    } else {
        alert("Ajax call failed with status "+statusCode);
    }
});

Каждый раз, когда вы выполняете асинхронные вызовы, вам следует использовать обратные вызовы, если вы планируете выполнять действия впоследствии в вызывающей функции.

person Karl-Henry Martinsson    schedule 02.11.2018