我的数据库中有一个类别对象的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,因此它可以在回调中直接使用,但我不确定这是否有意义。
答案 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>