2016-03-16 8 views
2

Я пытаюсь реализовать библиотеку javascript Sweet Alert в своем приложении.SSJS запускается до функции обратного вызова CSJS

Вот соответствующий код:

<xp:link escape="true" text="" id="link2" style="color:#4A4A4A"> 
<i class="fa fa-trash-o fa-lg"> 
</i> 
<xp:eventHandler event="onclick" 
submit="true" refreshMode="partial" refreshId="assetList"> 
<xp:this.action><![CDATA[#{javascript: 
var db:NotesDatabase = session.getDatabase(sessionScope.serverPath,sessionScope.dbName); 
var id = viewRow.getUniversalID(); 
var doc:NotesDocument = db.getDocumentByUNID(id); 
doc.remove(true);}]]></xp:this.action> 
<xp:this.script><![CDATA[swal({ 
title: "Are you sure?", 
text: "This asset will be permanently deleted", 
type: "warning", 
showCancelButton: true, 
confirmButtonColor: "#2196f3", 
confirmButtonText: "Ok", 
cancelButtonColor: "#607D8B", 
cancelButtonText: "Cancel", 
closeOnConfirm: true, 
closeOnCancel: true, 
confirmButtonClass: 'confirm-class', 
cancelButtonClass: 'cancel-class' 
}, 
function(isConfirm){ 
if (isConfirm) { 
return true; 
} else { 
return false; 
} 
}); 

//if(window.confirm("Are you sure you want to delete the asset?") != true) 
return false;]]></xp:this.script> 
</xp:eventHandler> 
</xp:link> 

При нажатии на ссылку удаляет строку, независимо от выбора я делаю (Отмена/OK). Я вижу, что удаление происходит еще до того, как я сделаю свой выбор. У меня такое чувство, что оно имеет какое-то отношение к порядку исполнения для обратного вызова.

Если я использую код, закомментированный в конце (window.confirm), он отлично работает.

Я был бы признателен за ваше руководство по этому вопросу.

Спасибо,

Dan

+0

Я подозреваю, sweetalert может конфликтовать с эмиссионным XPages AMD имеет. Я пытаюсь подтвердить. –

+0

Дэвид, нет конфликта AMD.Я получаю подсказку Sweet alert. Но код SSJS выполняется еще до того, как у меня появится возможность выбрать «Отмена» или «ОК». –

+0

hmm интересно. Я получил ошибку AMD. Как только я добавил SweetAlert на свою страницу и попробовал что-то простое, ничего не вышло, и даже базовое предупреждение («тест») в CSJS не сработало. Мне пришлось войти в файл sweetalert-dev.js и изменить значение amd.define на false. Затем простые вещи начали работать, как ожидалось. –

ответ

1

Я решил, создав скрытую кнопку. Я удалил код SSJS из моей ссылки и из CSJS ссылки, названной событием клика скрытой кнопки, чтобы выполнить SSJS.

Вот обновленный код:

<xp:link escape="true" text="" id="link2" style="color:#4A4A4A"> 
<i class="fa fa-trash-o fa-lg"> 
</i> 
<xp:eventHandler event="onclick" 
submit="true" refreshMode="partial" refreshId="assetList"> 
<xp:this.script><![CDATA[swal({ 
title: "Are you sure?", 
text: "This asset will be permanently deleted", 
type: "warning", 
showCancelButton: true, 
confirmButtonColor: "#2196f3", 
confirmButtonText: "Ok", 
cancelButtonColor: "#607D8B", 
cancelButtonText: "Cancel", 
closeOnConfirm: true, 
closeOnCancel: true, 
confirmButtonClass: 'confirm-class', 
cancelButtonClass: 'cancel-class' 
}, 
function(response){ 
if (response == true) { 
var deleteAssetBtn = '#{javascript:getClientId("deleteAsset")}'; 
document.getElementById(deleteAssetBtn).click(); 
return true; 
} else { 
return false; 
} 
}); 
]]></xp:this.script> 
<xp:this.action><![CDATA[#{javascript:viewScope.docID = viewRow.getUniversalID();}]]> 
</xp:this.action> 
</xp:eventHandler> 
</xp:link> 

А вот код для скрытой кнопки, которая фактически выполняет удаление документа:

<!-- Hidden button --> 
<xp:button value="Delete Asset" id="deleteAsset" style="display:none"> 
<xp:eventHandler event="onclick" submit="true" refreshMode="complete"> 
    <xp:this.action><![CDATA[#{javascript:try { 
var db:NotesDatabase = session.getDatabase(sessionScope.serverPath,sessionScope.dbName); 
var doc:NotesDocument = db.getDocumentByUNID(viewScope.docID); 
doc.remove(true); 
viewScope.docID = ""; 
} catch(e) { 
requestScope.errstatus = e.toString(); 
}}]]></xp:this.action> 
</xp:eventHandler> 
</xp:button> 

Если у кого есть лучший способ для достижения этого результата , Я открыт для предложений :)

+0

Я вижу blogpost coming ;-) –

2

Проблема заключается в том, что сторонние запросы не блокируют и не ждут ответа, прежде чем продолжить, как это делают собственные подсказки браузера.

Этот SO пост показывает пример ввода кода в функции обратного вызова, чтобы попытаться работать с Сладкие оповещения (но, похоже, что вы уже делаете что-то подобное): sweetalert blocking like normal prompt

Инициирование событие одним нажатием кнопка, которая будет запускать серверный код, выполнит свою работу. Если вы хотите, чтобы он выполнялся асинхронно (но не нужно обновлять клиентскую страницу на странице), вы могли бы запустить json rpc-метод в обратном вызове или сделать вызов настраиваемой службе REST для запуска кода на стороне сервера вместо запуска скрытая кнопка.

+0

Спасибо, Брэд. –

1

Вы можете добавить дополнительное событие вместо добавления скрытой кнопки.
Т.е. в следующем коде у вас есть радио с 2 событиями:
- onchange - это стандартное событие, в котором выполняется ваш CSJS
- onchangepost - это дополнительное событие, которое содержит ваш код, который будет оцениваться после события onchange (не avialable пользовательский интерфейс дизайнера, вы должны добавить его вручную).

Я предполагаю, что ваш обменный код является асинхронным. Если у вас есть раздел onEnd/onComplete, вы добавляете код, который будет оцениваться после завершения его работы (возможно, вы нажмете на свою кнопку там). Это место, где вы можете запустить свой код, используя onchangepost то есть огнь фрагмента события (https://openntf.org/XSnippets.nsf/snippet.xsp?id=manually-fire-attached-event)

<xp:radioGroup id="myRadio" required="false"> 
    <xp:selectItem itemLabel="Option a" 
     itemValue="A"> 
    </xp:selectItem> 
    <xp:selectItem itemLabel="Option b" itemValue="B"> 
    </xp:selectItem> 
    <xp:eventHandler event="onchange" submit="false"> 
     <xp:this.script> 
      <![CDATA[ 
       doYourClientJS(
        {onComplete: fireEvent(dojo.byId('#{id:myRadio}'), 'changepost') 
       });      
      ]]></xp:this.script> 
    </xp:eventHandler> 
    <xp:eventHandler event="onchangepost" 
     submit="true" refreshMode="partial" refreshId="otherUserInnerRefreshSection" 
     execMode="partial" execId="otherUserRefreshSection" 
     disableValidators="true"> 
     <xp:this.action><![CDATA[#{javascript:doYourSSJS;}]]></xp:this.action> 
    </xp:eventHandler> 
</xp:radioGroup>