Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 获取给定ID的对象的角度grep或filter_Angularjs_Json_Filter - Fatal编程技术网

Angularjs 获取给定ID的对象的角度grep或filter

Angularjs 获取给定ID的对象的角度grep或filter,angularjs,json,filter,Angularjs,Json,Filter,我的数据库中有一个类别对象的json数组。(我将其存储在控制器的vm.data中,该控制器绑定到角度中继器。) 现在我需要返回并使用每个子类别中的“类别”字段获取每个类别中的子类别 以下是我的通用数据获取程序: function getData(params, callback) { $http({ method: 'GET', url: 'database.php', params: params }).then(function

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

现在我需要返回并使用每个子类别中的“类别”字段获取每个类别中的子类别

以下是我的通用数据获取程序:

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);
    });
};
然后,它一个接一个地获得子类别:

function getSubCat(categoryId) {
    var params = {};
    params.table = "SubCats";
    params.where_field = "Category";
    params.where_value = categoryId;
    getData(params, buildSubCat);
};
这又回到了这一点:(我不再有类别Id,所以我必须在我的子类别数据中查找它)

就在这里,我遇到了麻烦

我需要在vm.data中获得唯一的类别对象-实际对象,而不是它的副本-,其uID等于我当前正在处理的子类别的ID,然后将当前子类别对象添加到其中。上述方法不起作用。至少,我从未在vm.data中看到类别中的子类别

我试着把它拆开,就像这样:

var foo = $filter('filter')(vm.data, function(el){
    el.uID==categoryId; 
}, true);
foo.SubCats = data;
<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>
但是foo是Category对象的新实例,而不是vm.data中的引用,因此我的添加不会影响vm.data。 我想我可以尝试用foo替换vm.data[n],但这似乎是一个糟糕的做法

如何异步检索类别和子类别并将它们组合起来


我脑子里有一种感觉告诉我应该将实际的Category对象传递到getData中,因此它可以直接在回调中使用,但我不确定这是否有意义。

好的,我想出了一个解决方案,只是不确定它是否是最好的

我接受第三个参数将目标对象传递到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 buildCats(target, data) {
    target = data;
    $.each(target,function(index, catObj){
        getSubCat(catObj);
    });
};
但由于某些原因,它不起作用。目标似乎已丢失对vm.data的引用。如果你能找出哪里出了问题,就可以获得额外的积分

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

function buildCats(target, data) {
    vm.data = data;
    $.each(vm.data,function(index, catObj){
        getSubCat(catObj);
    });
};
现在,我可以将实际的类别对象本身传递给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如下所示:

var foo = $filter('filter')(vm.data, function(el){
    el.uID==categoryId; 
}, true);
foo.SubCats = data;
<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>

{{cat.Name}
{{SubCat.Name}