1

ボタンがあります。そのボタンをクリックすると、次のことが必要になります。

  • メソッドを実行する
  • ポップアップを表示する必要があります。

コードは次のとおりです。

$('.dwnSingleImageLink').live('click', function(event){
    $('html, body').animate({scrollTop : 0}, 'slow');
    singleFileDownload = true;

    var renditions = getRenditionResultset($(this).attr('data-id'), $(this).attr('data-docname'));

    for(var i = 0; i < renditions.length; i++){
        var name = renditions[i].name;
        if(name == 'Web' || name == 'Thumbnail' || name == 'Preview' || name == 'Native File'){
            var info = {
                name: renditions[i].name,
                fileSize: renditions[i].fileSize,
                width: renditions[i].width,
                height: renditions[i].height,
                label: ''
            };
            renditionInfos.push(info);
        }
    }

    $('#downloadModal').find('input:hidden').attr({
            'data-id': $(this).attr('data-id'), 
            'data-docname': $(this).attr('data-docname'),
            'data-title': $(this).attr('data-title')
    }).after(function(){            
        $('#downloadModal').modal('show').css({
            width: '380px',
            'margin-left': function () {
                return - ($(this).width() / 2);
            }
        });
    });
});

var getRenditionResultset = function(dID, dDocName){
    var submitData = { 
        IdcService: 'RENDITION_INFO',
        dID: dID,
        dDocName: dDocName
    }; 

    var renditions = new Array();
    var fields = new Array();

    $.ucm.executeServiceIsJson(submitData, function(ucmResponse) {
        var resultSet = ucmResponse.ResultSets['manifest'];
        alert('jym');                                   

        for (var fieldIndex = 0; fieldIndex < resultSet.fields.length; fieldIndex++) {
            var field = new RenditionField();
            field.name = resultSet.fields[fieldIndex].name;
            field.index = fieldIndex;

            fields.push(field);
        }

        for(var rowIndex = 0; rowIndex < resultSet.rows.length; rowIndex++) {
            var rendition = new Rendition();

            for(var i = 0; i < fields.length; i++){
                var value = resultSet.rows[rowIndex][fields[i].index];                  

                switch(fields[i].name){
                    case 'extRenditionName' : 
                        rendition.name = value;
                        break;
                    case 'extRenditionDescription' :
                        rendition.description = value;
                        break;
                    case 'extRenditionPath' :
                        rendition.path = value;
                        break;
                    case 'extRenditionOriginalName' :
                        rendition.originalName = value;
                        break;
                    case 'extRenditionParams' :
                        rendition.params = value;
                        break;
                    case 'extRenditionType' :
                        rendition.type = value;
                        break;
                    case 'extRenditionFileSize' :
                        rendition.fileSize = value;
                        break;
                    case 'extRenditionWidth' :
                        rendition.width = value;
                        break;
                    case 'extRenditionHeight' :
                        rendition.height = value;
                        break;
                    case 'extRenditionFileType' :
                        rendition.fileType = value;
                        break;
                    case 'extRenditionPixelsPerInchVertical' :
                        rendition.pixelsPerInchVertical = value;
                        break;
                    case 'extRenditionPixelsPerInchHorizontal' :
                        rendition.pixelsPerInchHorizontal = value;
                        break;
                    case 'extRenditionColours' :
                        rendition.colours = value;
                        break;          

                }                   
            }

            renditions.push(rendition);
        }
    });

    return renditions;
}

function RenditionField() {
    this.name = '';
    this.index = -1;
}

function Rendition() {
    this.name = '';
    this.description = '';
    this.path = '';
    this.originalName = '';
    this.params = '';
    this.type = '';
    this.fileSize = '';
    this.width = '';
    this.height = '';
    this.fileType = '';
    this.pixelsPerInchVertical = '';
    this.pixelsPerInchHorizontal = '';
    this.colours = '';
}

Rendition.prototype.toString = function() {
    return '[object Rendition: name=' + this.name + ';description=' + this.description + ';path=' + this.path + ';originalName=' + this.originalName +
    ';params=' + this.params + ';type=' + this.type + ';fileSize=' + this.fileSize + ';width=' + this.width + ';height=' + this.height + ';fileType=' + 
    this.fileType + ';pixelsPerInchVertical=' + this.pixelsPerInchVertical + ';pixelsPerInchHorizontal=' + this.pixelsPerInchHorizontal + ';colours=' +
    this.colours + ']';
}

ビッグコードです。それは、ajax リクエストを送信し、レスポンスを受信することです。次に、応答を処理して配列を作成します。これらはメソッドの仕事ですgetRenditionResultset()。しかし、配列の生成前の私のアプリケーションでは、このメソッドの呼び出しの下にある for ループが show modal ブロッ​​クも実行されます。メソッドの終了を待ってから for とハンドラーgetRenditionResultset()の残りのコードを実行するにはどうすればよいですか? この場合のclick使用方法はありますか?$.when()よろしく。

4

3 に答える 3

1

メソッドへのパラメーターとしてもう 1 つのコールバックを受け入れますgetRenditionResultset

var getRenditionResultset = function(dID, dDocName, onComplete){ 

  $.ucm.executeServiceIsJson(submitData, function(ucmResponse) {
    //after creating the array with the reponse

    if(typeof onComplete === function){
       onComplete()
    }


  }
}

呼び出しの時点で、

$('.dwnSingleImageLink').on('click', function(event){
 .
 .
     var renditions = getRenditionResultset(blah, blah, function(){
        //code to execute after request has completed.
     }
 .
 .
}
于 2012-08-31T17:35:18.303 に答える
0

AJAX 呼び出しは非同期になる傾向があります。その結果、さらにコードを実行する前に、それらの完了を待つ必要があります。幸いなことに、jQuery はそのようなタスクのための機能を提供します。その AJAX メソッドは、いくつかのオプションのコールバック パラメータを受け取ります。たとえば、次のコードは、リクエストが完了するのを待ってから実行されます。

$.ajax({
    "url": "http://example.com/ajax.php",
    "type": "post",
    "dataType": "json",
    "success": function(data) {
        // data is a json-decoded object.
    }
});
于 2012-08-31T17:35:34.487 に答える
0

内で AJAX 成功コールバックを使用しgetRenditionResultSetて、モーダルを表示するポストコール コードを実行する必要があります。

于 2012-08-31T17:35:40.707 に答える