Поле не сохраняется после submit () в сети в Domino - PullRequest
0 голосов
/ 17 октября 2018

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

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

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 в клиенте скрыто и доступно для редактирования, как и поле «Состояние», которое действительно сохраняется, так что, по крайней мере, я знаю, что сохранение работает?

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

1 Ответ

0 голосов
/ 02 ноября 2018

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

Одно решение, которое IMHO является более элегантным, будетиспользовать обратный вызов из 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);
    }
});

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

...