2016-05-27 1 views
2

Ich habe ein JSON-Array von Category-Objekten aus meiner Datenbank. (Ich speichere es in vm.data in meinem Controller, der an einen Winkel Repeater gebunden ist.)angular grep oder filter, um ein Objekt mit einer ID zu erhalten

Jetzt muss ich zurück gehen und die SubCats in jeder Kategorie mit dem 'Category' Feld in jedem SubCat.

Hier ist mein generischen Daten Getter:

function getData(params, callback) { 
    $http({ 
     method: 'GET', 
     url: 'database.php', 
     params: params 
    }).then(function successCallback(response) { 
     callback(response.data); 

    }); 
} 

Also, meine Kategorien zu bekommen, ich mache:

function getCats() { 
    var params = {}; 
    params.table = "Categories"; 
    getData(params,buildCats); 
}; 

, die

function buildCats(data) { 
    vm.data = data; 
    $.each(vm.data,function(index,value){ 
     getSubCat(value.uID); 
    }); 
}; 

ruft zurück, dann eines nach dem man bekommt die SubCats:

function getSubCat(categoryId) { 
    var params = {}; 
    params.table = "SubCats"; 
    params.where_field = "Category"; 
    params.where_value = categoryId; 
    getData(params, buildSubCat); 
}; 

, die wieder dazu aufruft: (Ich habe nicht mehr die Kategorie-ID, also muss ich gehen für sie in meiner SubCat Daten suchen)

function buildSubCat(data) { 
    var categoryId = data[0].Category; 
    $filter('filter')(vm.data, function(el){ 
     el.uID==categoryId; 
    }, true).SubCats = data; 
} 

und es ist hier, ich in Schwierigkeiten bin läuft.

Ich brauche halten die einzigartige Kategorie-Objekt erhalten in vm.data - das eigentliche Objekt, nicht eine Kopie davon - deren uID die ID der Subkategorien gleich ich zur Zeit der Verarbeitung, fügen Sie dann die aktuelle SubCat Objekt zu ihm. Das obige funktioniert nicht. Zumindest sehe ich nie die SubCats innerhalb der Kategorien in vm.data.

Ich versuchte, es auseinander zu ziehen, wie folgt aus:

var foo = $filter('filter')(vm.data, function(el){ 
    el.uID==categoryId; 
}, true); 
foo.SubCats = data; 

aber foo ist neue Instanz der Kategorie Objekt, kein Verweis auf die in vm.data, so meine nicht die Zugabe zu beeinflussen vm.data. Ich könnte versuchen, vm.data [n] durch foo zu ersetzen, aber das scheint eine schlechte Übung zu sein.

Wie kann ich die Kategorien und Unterkategorien asynchron abrufen und kombinieren?

Etwas kitzeln die Rückseite meines Gehirns sagt mir, ich sollte das tatsächliche Category-Objekt in die GetData übergeben, so dass es direkt im Rückruf verfügbar ist, aber ich bin mir nicht sicher, ob das Sinn macht.

Antwort

0

OK, ich habe eine Lösung gefunden, nur nicht sicher, ob es das Beste ist.

Ich nehme einen dritten param das Zielobjekt in die getData Funktion zu übergeben:

function getData(params, target, callback) { 
    $http({ 
     method: 'GET', 
     url: 'index.php', 
     params: params 
    }).then(function successCallback(response) { 
     callback(target, response.data); 

    }); 
} 

In meiner getCats, ich vm.data als Ziel param geben (obwohl es nicht notwendig ist, wie es sein in einem Moment gesehen).

function getCats() { 
    var params = {}; 
    params.table = "Categories"; 
    params.sort_field = "Order"; 
    params.sort_dir = "ASC"; 
    getData(params, vm.data, buildCats); 
}; 

Nun, ich sollte der Lage sein, dies zu tun:

function buildCats(target, data) { 
    target = data; 
    $.each(target,function(index, catObj){ 
     getSubCat(catObj); 
    }); 
}; 

Aber aus irgendeinem Grund funktioniert es nicht. Das Ziel scheint seinen Verweis auf vm.data verloren zu haben.Bonuspunkte, wenn Sie herausfinden können, was schief gelaufen ist.

Aber das ist in Ordnung - ich das Ziel nicht brauchen - ich die Ergebnisse zuweisen kann direkt vm.data:

function buildCats(target, data) { 
    vm.data = data; 
    $.each(vm.data,function(index, catObj){ 
     getSubCat(catObj); 
    }); 
}; 

ich jetzt das eigentliche Kategorie Objekt selbst zum getSubCat Aufruf passieren kann:

function getSubCat(categoryObject) { 

    var params = {}; 
    params.table = "SubCats"; 
    params.where_field = "Category"; 
    params.where_value = categoryObject.uID; 
    params.sort_field = "Order"; 
    params.sort_dir = "ASC"; 
    getData(params, categoryObject, buildSubCat); 
}; 

was bedeutet, ich habe jetzt die tatsächlichen Objekt in der Rückruf:

function buildSubCat(categoryObject, data) { 
    categoryObject.SubCats = data; 
}; 

Und mein HTML sieht wie folgt aus:

<div class="category" ng-repeat="cat in vm.data"> 
    <h2>{{cat.Name}}</h2> 
    <div class="subcategory" ng-repeat="SubCat in cat.SubCats"> 
     <h3>{{SubCat.Name}}</h3> 
    </div> 
</div> 
Verwandte Themen