angular grep或filter来获取给定ID的对象

时间:2016-05-27 19:08:45

标签: angularjs json filter

我的数据库中有一个类别对象的json数组。 (我将它存储在我的控制器中的vm.data中,该控制器绑定到角度转发器。)

现在我需要使用'类别'返回并获取每个类别的SubCats。每个SubCat中的字段。

这是我的通用数据获取器:

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

    });
}

所以,为了得到我的分类,我这样做:

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

回调

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

然后,逐个获得SubCats:

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

回调这个:(我不再拥有类别ID,所以我必须在我的SubCat数据中寻找它)

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

而且我在这里遇到了麻烦。

我需要掌握vm.data 中的唯一Category对象 - 实际对象,而不是它的副本 - ,其uID等于我当前处理的SubCats的ID,然后是ADD当前的SubCat对象。以上不起作用。至少,我从未在vm.data中的类别中看到SubCats。

我试图将它拉开,就像这样:

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

但是 foo是Category对象的新实例,而不是对vm.data 中的对象的引用,因此我的添加不会影响vm.data。 我想我可以尝试用foo替换vm.data [n],但这似乎是一种糟糕的做法。

如何异步检索Categories和SubCats并将它们组合起来?

我大脑后面的东西告诉我应该将实际的Category对象传递给getData,因此它可以在回调中直接使用,但我不确定这是否有意义。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个解决方案,但不确定它是否是最好的。

我接受第三个参数将目标对象传递给getData函数:

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

    });
}

在我的getCats中,我将vm.data作为目标参数传递(尽管没有必要,稍后会看到)。

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

现在,我应该能够做到这一点:

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

但由于某种原因,它不起作用。目标似乎已经失去了对vm.data的引用。如果你能弄清楚出了什么问题,可以获得奖励积分。

但是没关系 - 我不需要目标 - 我可以将结果直接分配给vm.data:

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

我现在可以将实际的Category对象本身传递给getSubCat调用:

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);
};

这意味着我现在在回调中有实际对象:

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

我的HTML看起来像这样:

<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>