1

一部のエンティティの親と子の依存関係を収集するajax呼び出しがあります。成功関数内で、ajaxが返すもの(データ)をグローバルレベルのオブジェクトに割り当てます。

$.ajax(
{
    type: "POST",
    url: 'ajax_handler.php',
    data: {action:'get_dependencies', relation:relation, 'jobs[]':jobs, project:project},
    dataType: 'json',
    async: false, //do not change
    success: function(data)
    {
        for(var key in data)
        {
            if( data.hasOwnProperty(key) )
            {
                //Copy data object to document level existingDependency object
                existingDependency[key] = data[key];
            }
        }
    },
    error: function(xhr)
    {
        alert('error2:'+xhr.responseText);
    }
});

関数内にあるこのAJAXを2回呼び出します。1つは親用、もう1つは子供用です。この行existingDependency[key] = data[key];がオブジェクトを再割り当てしているため、前の割り当てが失われていることがわかりました。つまり、existingDependencyオブジェクトは、['parent']プロパティと['child']プロパティの両方を一緒に保持することはできません。

これを修正するために、existingDependencyが両方のプロパティを保持するように以下の変更を行いました。

success: function(data)
{
    for(var key in data)
    {
        if( data[key].hasOwnProperty(relation) )
        {
            //Copy data object to document level existingDependency object
            existingDependency[key][relation] = data[key][relation];
        }
    }
}

しかし、これはまったく機能しません。previousDependencyオブジェクトは空です。以下のアラートは空です。

var keys = '';
for(key in existingDependency)
{
    keys += key+'\n';
}

alert(keys);

existingDependency[key][relation] = data[key][relation]この割り当てが機能しない理由はありますか?data [key] [relation]は、違いが生じる場合に配列を保持します。

4

1 に答える 1

1

拡張を使用:

$.ajax({
    type: "POST",
    url: 'ajax_handler.php',
    data: {
        action:'get_dependencies', 
        relation:relation, 
        'jobs[]':jobs, 
        project:project
    },
    dataType: 'json',
    async: false, //do not change
    success: function(data) {
        $.extend(true, existingDependency, data);//this will copy/merge "data" into "existingDependency". properties from "data" that also exist in "existingDependency" will be overwritten with those from "data".
    },
    error: function(xhr) {
        alert('error2:'+xhr.responseText);
    }
});

eD [key] = data [key]が機能するのに、eD [key] [relation] = data [key] [relation]が機能する理由については、コードを実行してデバッグすることができなければ、言うのは難しいことではありません。ただし、eD [key]がまだ存在しない場合は、それに「関係」を追加することはできません。そのための可能な修正は次のとおりです。

if (!eD.hasOwnProperty(key)){
    eD[key] = {};
}
eD[key][relation] = data[key][relation];
于 2012-12-28T17:18:56.767 に答える