2014-09-24 58 views
1

我剛剛使用Angular,並且遇到了我正在處理的項目的特定部分。對於其中一個模板,我希望使用來自不同商店的JSON文件的信息來僅顯示有關用戶當前所在頁面的商店的信息。在AngularJS的Array中搜索特定對象的JSON文件

我想通過使用$ routeParams過濾商店(因爲商店ID是我如何做路由),但我的過濾器只是返回一個空數組。

我的路由看起來是這樣的:

myProto.config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
    when('/home', { 
     templateUrl: 'partials/merchants.html', 
     controller: 'merchantListCtrl' 
    }). 
    when('/:merchantId', { 
     templateUrl: 'partials/deals.html', 
     controller: 'dealListCtrl' 
    }). 
    otherwise({redirectTo: '/home'}); 
}]); 

我的服務讀取JSON文件看起來像這樣:

var rmnProtoServices = angular.module('rmnProtoServices', ['ngResource']); 

merchantProtoServices.factory('Merchant', ['$resource', 
    function($resource){ 
     return $resource('merchants/merchants.json', {}, { 
     query: {method:'GET', isArray:true} 
     }); 
}]); 

我拉着形式JSON文件看起來是這樣的: [

{ 
     "id": "kohls", 
     "name": "Kohls", 
    }, 

    { 
     "id": "best-buy", 
     "name": "Best Buy", 
    } 

] 

最後我在控制器中運行的過濾器如下所示:

var merchants = Merchant.query(); 

$scope.merchant = $filter('filter')(merchants, {id: $routeParams.merchantId}); 

我想什麼它做的是恢復所有商家的陣列與該ID(我的下一步將是該數組中選擇的第一個對象,因爲它應該只包含一個單一的商家)。相反,它只是返回一個空數組。

我該如何去實際讓這個過濾器工作(或者是否有一些更好的方法,我應該使用)?

回答

0

Merchant.query()是異步調用,您嘗試在從服務器獲得響應之前過濾商家,請嘗試下面的代碼。

var merchants = Merchant.query() 
    .$promise.then(function(merchants) { 
    $scope.merchant = $filter('filter')(merchants, {id: $routeParams.merchantId}); 
    }); 
+0

工作,謝謝! – 2014-09-25 13:26:42

0

除了由@sss

也給出了答案,你可能會考慮查詢移動路線的決心塊:

myProto.config(['$routeProvider', 'Merchant', 
    function($routeProvider, Merchant) { 
    $routeProvider. 
    when('/home', { 
     templateUrl: 'partials/merchants.html', 
     controller: 'merchantListCtrl' 
    }). 
    when('/:merchantId', { 
     templateUrl: 'partials/deals.html', 
     controller: 'dealListCtrl', 
     resolve:{ 
      merchants: function() { 
       return Merchant.query(); 
      } 
     } 
    }). 
    otherwise({redirectTo: '/home'}); 
}]); 

這樣的角度將延遲改變路線直到查詢承諾得到解決,並且您可以立即在控制器中使用陣列:

function GenericController ($scope, $filter, $routeParams, merchants) { 
    $scope.merchant = $filter('filter')(merchants, {id: $routeParams.merchantId}); 
} 

這裏是更多關於: Delaying AngularJS route change until model loaded to prevent flicker