创建一个AngularJS工厂/对象来保存数组

时间:2015-03-04 17:25:57

标签: angularjs

如何更新此代码以保存值数组?我想持有FIELDNAME和VALUE。

我想通过执行以下操作来设置/添加到列表中 - 向数组/列表添加值。

userFilters.setData(' lastname', 'smith');
   userFilters.setData(' firstname', 'bob');
   userFilters.setData(' Mi', 'D');

让对象持有一个

数组
'lastname','smith'
'firstname','bob'
'mi','D'

App.factory('userFilters', [function () {

    var data = {};

    var getData = function (field) {
        return data[field];
    };

    var setData = function (field, value) {
        data[field] = value;
    };

    return {
        getData: getData,
        setData: setData
    }
}]);

2 个答案:

答案 0 :(得分:2)

您可以相当简单地重新创建它,而无需您正在创建的方法。

Javascript对象旨在完全按照您的要求进行操作。

App.factory('userFilters', function() {
  return {};
});

您可以使用方括号访问器来获取和设置值,而不是使用getter和setter。

// setting properties
userFilters['lastname'] = 'smith';
userFilters['firstname'] = 'bob';
userFilters['Mi'] = 'D';

// getting properties
userFilters['lastname']; // 'smith'
userFilters['firstname']; // 'smith'

如果您希望能够完全控制在获取/设置时间发生的事情,您可以查看使用内部getterssetters拦截这些来电,让您知道之前的属性名称手。

最后,您还可以在对象周围包装自己的get和set函数以隐藏它。但是,这将作为一种服务更有意义。

App.service('userFilters', function() {
  var store = {};

  this.get = function(key) {
    return store[key];
  };

  this.set = function(key, value) {
    store[key] = value;
  };
});

如果您的工厂/服务公开数组非常重要,那么我建议您坚持使用对象存储键和值,但添加数组导出方法。

App.service('userFilters', function() {
  var store = {};

  this.toArray = function() {
    var records = [];
    return Object.keys(store).map(function(key) {
      records.push([key, store[key]]);
    });
  };

  this.get = function(key) {
    return store[key];
  };

  this.set = function(key, value) {
    store[key] = value;
  };
});

如果要遍历属性,可以使用for-in循环。

for(var key in userFilters) {
  var value = userFilters[key];
  console.log(key, value);
}

您还可以使用Object.keys方法检查是否有任何密钥。

Object.keys(userFilters);  // ['lastname', 'firstname', 'Mi']

这将返回对象中所有键的数组。如果它的长度为0,那么你就知道它是空的。

答案 1 :(得分:1)

要使用数组进行存储,您需要同时更新getDatasetData方法,并将data定义为数组[]

App.factory('userFilters', [function () {

    var data = [];

    var getData = function (field) {
        for(var i=0; i<data.length; i+=2) {
            if(data[i] == field) {
                return data[i+1];
            }
        }

        return null;
    };

    var setData = function (field, value) {
        data = data.concat([field, value]);
    };

    return {
        getData: getData,
        setData: setData
    }

}]);