在angularJS CRUD应用程序中管理数据的最佳方法

时间:2015-03-29 16:29:42

标签: angularjs api optimization crud data-manipulation

首先,我想说英语不是我的母语,如果我不是100%明确的话,请提前表示歉意。

因此,我想为汽车创建一个基本的CRUD应用程序。 将有“/ cars”的路线列出所有车辆。 为了获得这些汽车数据,我将不得不打电话给API,它将立即向我发送所有汽车的所有数据,然后显示所有汽车名称。我想我现在是对的吗?

我遇到的“问题”是当用户点击特定的汽车时。 它应该将用户重定向到路线“cars / CAR_ID”并显示该特定车辆的数据。但是如何获取这些数据呢?我的意思是,是的,我可以做一个API调用“/ api / car / CAR_ID”,但是如果我已经在所有汽车的第一次api通话中拥有了我需要的一切,为什么我会这样做呢? 我一直在寻找每一个线程,到处都是,他们总是再打一次api电话,但这对我来说感觉像是浪费,我无法帮助它。 必须有一个理由为什么每个人都这样做,我错过了它。 我的意思是,另一种方法是存储第一个呼叫的数据,而不是进行第二次api呼叫,我们可以从第一次呼叫中获取数据。

我是网络开发的新手,所以最好是为每个页面提出请求,而不是第一次存储大量数据,并在整个导航过程中使用它。 如果是这样,我是否可以对这个主题有更多的了解,感觉就像向服务器询问我已经知道的东西......

2 个答案:

答案 0 :(得分:1)

对你问题的一部分提出了不同的答案。

  

我的意思是,是的,我可以进行一次API调用" / api / car / CAR_ID",但是如果我已经拥有了所有汽车的首次api通话中我需要的一切,为什么我会这样做?

如果您没有拨打第一个api电话,会发生什么?我的意思是,我不能直接输入我的浏览器/api/car/12345吗? 我们考虑使用stackoverflow作为一个例子,让我说我将这个问题加入书签,然后我直接打开这个页面(假设我没有缓存数据)而不通过带有问题列表的页面。在你的场景中,我会得到一个空白页面,因为创建者会假设我首先访问其他页面,这是不可思议的(并非总是如此)。为每个特定实体进行api调用会从一开始就从这样的陷阱中保存,因为它不会假设用户的浏览历史记录。

答案 1 :(得分:0)

以下是我能想到的选项。

1)使用ui-router(我的首选选项)。这是一个示例路线:

angular.module('carApp')
  .config(function ($stateProvider) {
    $stateProvider
      .state('cars', {
        url: '/cars',
        templateUrl: 'app/cars/views/index.html',
        controller: 'CarsCtrl',
        resolve: {
          cars : ['Car', function(Car) {
            return Car.list();
          }]
        }
      })
      .state('cars.show', {
        url: '/{carId}',
        views: {
          "@" : {
            templateUrl: 'app/cars/views/show.html',
            controller: 'CarCtrl'
          }
        },
        resolve: { // the cars from the parent route (cars) will be injected into this route
          car: ['$stateParams', 'cars', function($stateParams, cars) {
            // not hitting the web service, find our car using lodash
            return _.find(cars, {_id: $stateParams.carId});
          }]
        }
      })

OR

2)在您的服务中使用缓存

angular.module('carApp')
  .service('Car', function Car($http) {
    return {
      list: function() {
        return $http.get('/cars', {cache: true});
      }
    };
  });

第一次拨打Car.list()时,它会调用网络服务。对Car.list()的后续调用不会调用Web服务。在您的控制器中,您可以拨打Car.list并找到与cars.show路线类似的正确车辆,或者为您的服务添加另一项可以按ID查找车辆的功能。