0

ページの読み込み時に、以下の JavaScript 関数を使用して SharePoint リストを調べ、現在のユーザーが管理者である要求があるかどうかを確認し、存在する場合は、これらの要求を承認または拒否できるようにします。

 //Logic to approve events if the current user is a manager.
function promptToApproveEvents(){   
    var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
    var hostContext = new SP.AppContextSite(currentContext, hostUrl);
    var hostweb = hostContext.get_web();
    var list = hostweb.get_lists().getByTitle(paidTimeOffListName);

    //A caml query to get records where manager is equal to current user.
    var queryXml = "<View><Query><Where><Eq><FieldRef Name='Manager' /><Value Type='Integer'><UserID /></Value></Eq></Where></Query></View>"
    var query = new SP.CamlQuery();
    query.set_viewXml(queryXml);

    var items = list.getItems(query);

    currentContext.load(items);
    currentContext.executeQueryAsync(
    function() //on success.
        {       
        for(var i = 0;i < items.get_count();i++) {
            var item = items.getItemAtIndex(i);

            //Is the item we're looking at in need of approval?
            if (item.get_item("Approved") === false)
            {
                //Yes, prompt for approval.     
                //$('#approvalModal').modal('show'); //modals don't seem to work in loops.
                confirm("here's something in need of approval.");
            }
            else
            {
                //No, do nothing.
                alert("skip it, it doesn't need approved.");
            }
        }
    }, 
    function(sender,args){
        alert("Failed to get manager's name. Make sure your Organization Contacts list is filled out! Error: " + args.get_message()); //On fail
    }); 
}

私の問題は、ブートストラップモーダルを使用して、未承認のリクエストごとにユーザーに入力を促すことができると思ったことです。たとえば、リクエストに関する情報を提供すると、承認または拒否ボタンをクリックして、以下のモックアップのようなプロンプトを使用して判断を下すことができます。彼らがこのリクエストについて決定を下したら、コードを少し実行して、このリクエストに関する決定を記録します。その後、for ループが終了するまで、次のリクエストについてプロンプトが表示されます。

_________________________________________________________
|      Hey boss. What to you think of this request?     |
|            Name: xx                                   |
|            Reason: xx                                 |
|            Other info: xx                             |
|                                                       |
|         [ACCEPT]                  [REJECT]            |
|_______________________________________________________|

残念ながら、ポップアップするブートストラップ モーダルは 1 つだけで、for ループが終了した後に表示されます。これは、見つかった一致する各アイテムに対するプロンプトの望ましい動作に適合しません。

基本的に、これを達成するための最良の方法が何であるかはわかりません。アラートと確認ボックスのように、希望どおりに実行を「一時停止」し、希望どおりに動作します。(たとえば、未承認のリクエストが 2 つあり、承認済みのリクエストが 1 つある場合、上記のコードは、予想どおり、2 つの「確認」ボックスと「アラート」をポップアップ表示します。)また、プロンプトに表示したくない「X」ボタンもあります (許可または拒否を明示的にクリックするように強制する必要があります)。

私が取るべきアプローチについて何か提案はありますか?

4

2 に答える 2

1

ブートストラップのモーダル呼び出しは非同期であるため、非同期呼び出しの流れを制御する必要があります。これは手動で行うことができますが、通常は大きな頭痛の種です (少なくとも私にとっては)。

そのためのライブラリがいくつかあります (q、async など)。ただし、理解しやすく使い始めるのが簡単なhttps://github.com/caolan/asyncをお勧めします。

あなたの場合、おそらくhttps://github.com/caolan/async#eachseriesarr-iterator-callbackを使用するでしょう

for ループの代わりに、次のコード スニペットを使用します。

async.eachSeries(items, function( item, callback) {
            //Is the item we're looking at in need of approval?
            if (item.get_item("Approved") === false)
            {
                //Yes, prompt for approval.     
                //$('#approvalModal').modal('show'); //modals don't seem to work in loops.
                confirm("here's something in need of approval.", callback);
            }
            else
            {
                //No, do nothing.
                alert("skip it, it doesn't need approved.");
            }
});

また、モーダルが閉じた後に関数confirmが関数を呼び出すようにする必要があるため、次のモーダルが開きます(コールバックを呼び出しに追加したのはそのためです)。callbackasyncconfirm

于 2014-06-18T19:52:50.060 に答える