AngularJS - 存储数据,工厂

时间:2014-10-27 16:08:36

标签: angularjs angularjs-factory

下午全部,

我们上周一直在努力学习AngularJS并需要一些指导,我们希望能够在路由之间存储数据,例如userName,brandName和productName。目前我们正在使用routeParams,但发现这很麻烦,不得不一遍又一遍地重复代码。

同样在第(3)节中,我们有formData,我们可以将这些数据存储在工厂中,这样我们可以在提交最终数据之前在品牌之间跳转并更新产品吗?当我们离开每个品牌时,它会删除我们输入的数据。

如果有人能提供帮助,我们会非常感激, 谢谢。

Plunker示例

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

// (1) Employees 
amlProductCtrl.controller('employees', ['$scope', '$http',
  function($scope, $http) {
    $http.get('json/employees.json').success(function(data) {
      $scope.employees = data;
    });
  }
]);
// (2) Brands
amlProductCtrl.controller('brands', ['$scope', '$routeParams', '$http',
  function($scope, $routeParams, $http) {
    // UserName
    $scope.employee = {"userName": $routeParams.userName};
    // Welcome Message
    $scope.alerts = [{
      type: 'info',
      msg: 'Hello ' + $scope.employee.userName + ', please select a brand.'
    }];
    $scope.closeAlert = function(index) {
      $scope.alerts.splice(index, 1);
    };
    // Get JSON Data
    $http.get('json/brands.json').success(function(data) {
      $scope.brands = data; 
    });
  }
]);
// (3) Products
amlProductCtrl.controller('products', ['$scope', '$routeParams', '$http',
  function($scope, $routeParams, $http) {
    // BrandName
    $scope.brand = {"brandName": $routeParams.brandName};
    // UserName 
    $scope.employee = {"userName": $routeParams.userName};
    // Get JSON Data
    var rpBrandName = $routeParams.brandName; // BrandName
    var rsBrandName = rpBrandName.replace(/\s+/g, ''); // Remove Space
    var lcBrandName = rsBrandName.toLowerCase(); // Lowercase
    var brandName = lcBrandName;
    $http.get('json/'+brandName+'-products.json').success(function(data) {
      $scope.products = data;
    });
    // FormData
    $scope.formData = {};
  }
]);

1 个答案:

答案 0 :(得分:3)

这是一个可行的解决方案。创建一个在控制器之间共享数据的服务。它使用$ watch所以可能不是最有说服力的解决方案。我也在学习,所以我能感受到你的痛苦: - )

  myApp.factory('DataService', function () {
    var myObject = {
        id: 0, name: 'not set'
    };

    return {
       brandName: function () {
          return myObject.name;
        },
        setBrandName: function (brand) {
          myObject.name = brand.name;
        }
     };

   });

您可以构建对象以更好地反映您的需求。谷歌有很多文章提供解决方案。希望这可以帮助。检查这个plunker:http://plnkr.co/edit/9rw3kHCfwatqAw6TRQeW?p=preview转到#2并选择一个品牌。您会注意到其他2个更新到所选项目。