2017-01-09 5 views
0

私はJSを初めて使い、新しいプロジェクトでselect2を取得しましたが、現時点ではこのようなコードがあります(これはちょっとしたバージョンです):別のAJAXリクエストでSelect2プラグインのAJAXレスポンスをフィルタリングする

$("#group-search").select2({ 
    ajax: { 
     url: "groups.search", 
     dataType: 'jsonp', 
     data: function (term, page) { 
     return { 
      q: term, 
      access_token: access_token 
     }; 
     }, 
     results: function (data, page) { 
     return { results: data.response.items }; 
     } 
    } 
    }); 

しかし、結果(data.response.items)を別のAJAXリクエストの助けを借りてフィルタリングする必要があります。何とか達成することは可能ですか?

UPDATE 1

これは私がValLenain 提案に応じて行うことを試みたが、それは動作しないものです:

results: function (data, page) { 
    var groups = data.response.items; 

    var groupIds = new Array; 
    groups.forEach(function (group) { 
     groupIds.push(group.id); 
    }); 

    $.ajax({ 
     url: "groups.getById", 
     dataType: 'jsonp', 
     data: { 
     group_ids: groupIds, 
     v: '5.60', 
     access_token: access_token 
     }, 
     success: function(data, page) { 
     return { results: data.response }; 
     } 
    }).then(function(response){ 
     groups = []; 
// so at this moment we are expecting the select field to become empty, right? 
// it doesn't work that way, nothing changes 
    }); 

    return { results: groups }; 
    } 

答えて

0

私が試していないが、あなたのresults機能を変更決してしましたあなたが空の配列を最初に返して、それをajax呼び出しで更新すると、ajax呼び出しがうまくいくかもしれません。あなたの更新あなたがgroups変数などが参照するオブジェクトを変更している1

について

results: function (data, page) { 
    var items = []; 

    /* Since I don't know what your ajax call is nor 
    * what it takes as arguments or returns, I just write 
    * a fake one. 
    */ 
    ajaxCall(data.response.items).then(function(filteredItems) { 
    /* update here the items array 
    * it's important to change the existing object, not 
    * to create a new one 
    */ 
    }); 
    return { results:items }; 
} 

、あなたが以前に戻ってきたもの(data.response.items)は更新されません。

は私が機能

/* Set groups to an empty array so the select2 
* component will never display unfiltered value. 
*/ 
var groups = []; 

var groupIds = new Array; 
data.response.items.forEach(function (group) { 
    groupIds.push(group.id); 
}); 

$.ajax({ 
     url: "groups.getById", 
     dataType: 'jsonp', 
     data: { 
     group_ids: groupIds, 
     v: '5.60', 
     access_token: access_token 
     }, 
     success: function(data, page) { 
     /* Here I assume your items are in data.response.items. 
     * We push all the items into the existing array, without 
     * creating a new array (so we keep the reference). 
     */ 
     Array.prototype.push.apply(groups, data.response.items); 

     /* The return statement is optional here */ 
     return { results: data.response }; 
     } 
    }); 

    return { 
    results: groups 
    } 
+0

@VaIleNainのボディを書き換えてきましたが、 'リターン{結果:アイテム}ではないでしょう;'ステートメントを '関数(filteredItems)'長い時間前に解雇されますか?それはAJAXの呼び出しのポイントではありませんか?または、私はここに何かを逃している? –

+0

@VaILeNain、私はちょうどそれを試して、それは私が期待どおりに働いた。 'return {results:items};'がフィルタリングajax呼び出しの前に実行されています。完全なコードが必要な場合は私のメインポストを更新することができます –

+0

はい、return文は2番目のajax呼び出しの前に実行されますが、返されるオブジェクト(たとえば '{results:items}')はajax呼び出しの後に更新されます私たちはそれを参照しているからです。 – ValLeNain

関連する問題