我在获取正确的数据方面遇到了一些麻烦。我有多对多关系模型,所以它有3个表,两个有数据,第三个是它们之间的连接(通过ID)。例如,第一个表是商店,第二个是商品,第三个是'have',它们通过id连接它们。
现在我应该显示每个商店的可用商品。我正在使用ng-repeat =“store in stores”来遍历商店,并尝试创建将返回每个商店中可用商品的函数(store.idStore)。
我尝试了几种方法,似乎没有一种方法适合我,而且因为我是角色的新手,所以我有点失落。我将不胜感激任何帮助。
我使用的最后一项功能是:
function forEachStore(id) {
angular.forEach($scope.Have, function (value, index) {
if (idStore == id) {
alert(idPlayliste);
this.push(dataFact.catchData(urlItem, idItem));
}
}, $scope.storeHasItem)
}
$ scope.Have - &gt;包含json对象,如({“id”:1,“idStore”:1,“idItem”:1},{“id”:2,“idStore”:1,“idItem”:2},...)< / p>
dataFact.catchData - &GT;我的工厂获取api url和idItem并返回json对象(这是正常工作)。
id == store.idStore从ng-repeat发送。
所以,我发送给这个函数'store.idStore',我想让它返回该商店中可用的所有商品。
我没有提醒:)
答案 0 :(得分:0)
编辑: 在评论启发第二读:)。
我认为idStore
应为value.idStore
(此处:
angular.forEach($scope.Have, function (value, index) {
if (idStore == id) { ... })};
)
还有: angular.forEach(obj,iterator,[context]),其中context将提供&#39; this&#39;对于迭代器。您将上下文设置为$ scope.storeHasItem - $ scope上的一个函数,我猜它不是您追求的目标。
旧答案:
当您使用ng-repeat="store in stores"
时,您会得到以下内容:store = stores [0]在范围内+视图中的dom模板(您在其中的元素的副本&#39;我把重复)...然后存储=存储[1]和副本......等等
因此在函数中,您获得的参数是整个商店对象,而不仅仅是id。试试console.log - 它应该澄清一些事情。
答案 1 :(得分:0)
从您的代码看起来$scope.stores
是一个Store对象数组。我假设你有类似物品的东西。在第一个ng-repeat循环中,添加类似ng-repeat="item in getItemsForStore(store.idStore)"
的内容以启动内部循环,并将以下函数添加到范围(尚未测试):
$scope.getItemsForStore = function(storeId) {
var items = [];
for (var have = $scope.have, i = 0, len = have.length; i < len; i++) {
var link = have[i];
if (link.idStore === storeId && !items.contains(link.idItem) {
items.push(link.idItem);
}
}
for (int j = 0, len = items.length; j < len; j++) {
items[j] = getItem(items[j]);
}
return items;
}
function getItem(itemId) {
for (var i = 0, items = $scope.items, len = items.length; i < len; i++) {
var item = items[i];
if (item.idItem === itemId) {
return item;
}
}
throw "unknown item ID: " + itemId;
}
如果您使用对象而不是数组,其中的项目/存储由ID键入,那么事情可能会更有效率。
答案 2 :(得分:0)
function Ctrl($scope){
$scope.stores =[
{id:1,name:'store 1'},
{id:2,name:'store 2'},
{id:3,name:'store 3'},
{id:4,name:'store 4'}
];
$scope.items =[
{id:1, name:'item 1'},
{id:2, name:'item 2'},
{id:3, name:'item 3'},
{id:4, name:'item 4'},
{id:5, name:'item 5'},
{id:6, name:'item 6'},
];
var storeItemLinked= [
{sId:1,iId:1},
{sId:1,iId:2},
{sId:1,iId:3},
{sId:2,iId:4},
{sId:2,iId:5},
{sId:2,iId:6},
{sId:3,iId:1},
{sId:3,iId:3},
{sId:3,iId:5},
{sId:4,iId:2},
{sId:4,iId:4},
{sId:4,iId:5}
];
$scope.selectedStoreItems=[];
$scope.showStoreItems=function(store){
$scope.selectedStoreItems=[];
$scope.selectedStore=store;
var itemIds=[];
for(var i=0;i<storeItemLinked.length;i++){
if(storeItemLinked[i].sId==store.id)
itemIds.push(storeItemLinked[i].iId);
}
for(var j=0;j<$scope.items.length;j++){
if(itemIds.indexOf($scope.items[j].id)>=0)
$scope.selectedStoreItems.push($scope.items[j]);
}
}
$scope.showAvailableStores = function(item){
$scope.selectedItem=item;
$scope.selectedItemStores=[];
var storeIds=[];
for(var i=0;i<storeItemLinked.length;i++){
if(storeItemLinked[i].iId==item.id)
storeIds.push(storeItemLinked[i].sId);
}
for(var j=0;j<$scope.stores.length;j++){
if(storeIds.indexOf($scope.stores[j].id)>=0)
$scope.selectedItemStores.push($scope.stores[j]);
}
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.11/angular.min.js"></script>
<div ng-app ng-controller="Ctrl">
<ul>
<li ng-repeat="store in stores" ng-click="showStoreItems(store)">{{store.name}}
<ul ng-show="selectedStore==store">
<li ng-repeat="item in selectedStoreItems" ng-click="showAvailableStores(item)">
{{item.name}}
<ul ng-show="selectedItem==item">
<li ng-repeat="store in selectedItemStores">{{store.name}}</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
点击商店将列出所有可用商品,然后点击商品将列出销售该商品的所有商店
我只是通过一些js对象来模拟数据库,你可能想要更改那些ng-click函数来获取远程数据,里面的逻辑将取决于从服务器返回的视图模型