javascript - AngularJS:获取具有特定id的数据

标签 javascript json angularjs

我正在尝试通过产品 ID 从包含产品的 JSON 文件中获取特定产品。我有一些问题,就像这个问题 AngularJS : get back data from a json array with an id 代码是类似的。我通读了那个问题和那里接受的答案,仍然无法弄清楚这一点。据我了解, $scope.search() 返回一个 promise ,成功后触发 .then() 设置获取正确的人。

这行代码打印出产品数组,并从 URL 中获取产品 ID。 但是它在控制台中打印两次。

console.log($scope.products + $routeParams.productId);

app.js

var app = angular.module('gtbApp', [
    'ngRoute',
    'productControllers'
]);

// Setting up the routes with right controllers and partials
app.config(['$routeProvider', function($routeProvider){
    $routeProvider
        .when('/main', {
            templateUrl: 'partials/product-grid.html',
            controller: 'ProductController'
        })
        .when('/product/:productId', {
            templateUrl: 'partials/product-detail.html',
            controller: 'ProductDetailCtrl'
        })
        .otherwise({
            redirectTo: '/main'
        });

}]);

Controller .js

var app = angular.module('productControllers', []);

// For product-grid.html
app.controller('ProductController', ['$http', function($http){
    var store = this;
    store.products = [];    
    $http.get('products.json').success(function(data){
        store.products = data;
    });

}]);

// For product-detail.html
app.controller('ProductDetailCtrl', ['$scope', '$routeParams', '$http', function($scope, $routeParams, $http){

$scope.search = function() {
    var url = 'products.json';
    // Return a promise object
    return $http.get(url).success(httpSuccess).error(function(){
        console.log('Unable to retrieve info form JSON file.');
    });
}

httpSuccess = function(response) {
    $scope.products = response;
}

function getById(arr, id) {
    for (var i = 0, len = arr.length; i < len; i++) {
        if (arr[i].id === id) {
            return arr[i];  
        }
    }
}

$scope.search().then(function(){
    // Prints out the products array and id twice
    console.log($scope.products + $routeParams.productId);
    $scope.product = getById($scope.products, $routeParams.productId);
    // Prints out twice "undefined"
    console.log($scope.product); 
});

}]);

主要问题是如何根据“ProductDetailCtrl”中的 id 获取特定产品

$scope.product = getById($scope.products, $routeParams.productId); 

不起作用。

提前致谢!

更新: 发现为什么 $scope.product 未定义,这只是因为 $routeParams.productId 是一个字符串,而在 getById() 中第二个参数需要一个整数。 但是我不知道为什么 console.log($scope.product);打印两次。

最佳答案

我不太明白你的主要问题是什么。但无论如何。当您使用 $http 服务时,它将返回一个 promise ,您最终必须解开它。您在代码中所做的是将其展开两次。这很好。

对于 $http 响应,您可以使用“success”/“error”或仅使用“then”,后者可以接受成功和错误回调。这意味着您可以在搜索函数中解包,也可以在调用搜索函数之后解包。

$scope.search = function() {
    var url = 'products.json';
    $http.get(url)
         .success(function(data){
             $scope.product = getById($scope.products, $routeParams.productId);
         })
         .error(function() {
            console.log('Unable to retrieve info form JSON file.');
         });
}

您还可以执行以下操作:

$scope.search = function() {
    var url = 'products.json';
    return $http.get(url);
}

$scope.search().then(function(data) {
    $scope.product = getById(data, $routeParams.productId);
}, errorCallback);

下面的代码会达到相同的结果

$scope.search = function() {
    var url = 'products.json';
    return $http.get(url);
}

$scope.search()
      .success(function(data) {
          $scope.product = getById(data, $routeParams.productId);
      })
      .error(errorCallback);

或引用 promise :

$scope.search = function() {
    var url = 'products.json';
    return $http.get(url);
}

var dataPromise = $scope.search();

dataPromise.then(function(data) {
    $scope.product = getById(data, $routeParams.productId);
}, errorCallback);

您需要知道的是,只要您在 success/error/then 函数中返回某些内容,它就会返回一个 Promise,您必须解开该 Promise 才能获取数据。

关于javascript - AngularJS:获取具有特定id的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26486816/

相关文章:

c# - DatePicker 中的特定日期

android - 使用从 AutoCompleteTextView 中选择的项目的相应数据设置隐藏字段的值

arrays - 通过属性将数组传递给 AngularJS 指令

asp.net - 升级到Visual Studio 2010后找不到System.Web.Script.Service命名空间错误

javascript - Angular : Service variable changes not applying

javascript - 在 Controller 和数据对象之间同步数据

javascript - 如何使用 jQuery 检测浏览器类型?

javascript - 如何在 Dart 应用程序中应用 Redux 概念?

javascript - 使用 AJAX 响应作为函数外部的 var

javascript - 循环nodejs中的setInterval