2

我有一个带有两个对象数组的 JSON 对象x

我正在使用 angularJS,我想在 JSON 中添加/编辑/删除对象(就像 angular.org 上的 Angular TODO 应用程序示例一样)。

有没有办法创建一个新的空(结构为x但没有值)JSON 对象x,并简单地将其推送到上面的 JSON 对象数组?

如何创建一个空值 JSON 对象x

我的 Sample 对象 x (我取消了所有值)粘贴在下面。所以我的 JSON 只是这些对象的数组。在 Angular 中,我希望用户填写表单并将数据保存在这种类型的空对象中,然后将其推送到数组中。这就是我的目标。

示例 JSON

      [{
        "id": null,
        "title": "",
        "date": {},
        "billPayerId": null,
        "notes": "Sample Notes",
        "billFinances": {
            "billPayerId": null,
            "billItemEntry": [
                {
                    "itemDescriptionId": 1,
                    "itemDescription": "",
                    "userIdAndLiableCost": [
                        {
                            "userId": null,
                            "liableCost": null
                        },
                        {
                            "userId": null,
                            "liableCost": null
                        }
                    ]
                },
                {
                    "itemDescriptionId": null,
                    "itemDescription": "",
                    "userIdAndLiableCost": [
                        {
                            "userId": null,
                            "liableCost": null
                        },
                        {
                            "userId": null,
                            "liableCost": null
                        }
                    ]
                }
            ],
            "billTotal": null
        },
        "groupId": null
    }];
4

2 回答 2

4

您可以使用对象文字来存储您想要的任何内容。它只是一组属性(即名称)和值。例如var order = {};

然后可以使用数组文字来保存订单。 e.g var orders = []; orders.push(order); 但是使用带有 id 作为属性的另一个对象字面量同样容易。

但似乎你想要某种验证。也许是管理订单数据和处理验证等的东西。像这样:

orderManager.dataStore = {
  _data: {},
  //_redundantData = [];  //could easily store in an array if id isn't unique
  get: function (id) {
    return this._data[id];
  },
  getAll: function () {
    return this._data;
  },
  set: function (id, order) {
    validateOrder(order);
    this._data[id] = order;
  },

  clear: function (id) {
    this._data[id] = undefined;
  },
  add: function (order) {
      validateOrder(order);
      this._data[order.id] = order;

  },
  assertNotNull: function (data, key) {
      if(data[key] == undefined) {
        throw new Error("Key Missing: " + key + " for " + data.name);
      }
  },
  validateOrder: function(order) {
    assertNotNull(order,"id");
    assertNotNull(order,"title");
    //etc
  },
  containsOrder: function (id) {
    for(var i=0;i<array.length;i++) {
        if(array[i].id === id) {
            return true;
        }
    }
    return false;
  }
};
于 2013-06-08T21:02:31.340 回答
3

如果我没看错,我想你可能误解了 Angular 的工作原理。您不必为 Angular 在表单中使用创建一个空对象。只要您的表单输入使用点表示法,它就会在用户用数据填写输入时为您生成对象。

例如

<form>
    <input type="text" ng-model="myForm.name">
    <input type="text" ng-model="myForm.email">
    <input type="text" ng-model="myForm.nickname">
</form>

由于我们在属性中使用了点符号ng-model,它会在用户填写表单时为我们创建对象。输入完成后生成的对象将如下所示:

$scope.myForm = {
    name: 'Justin',
    email: 'justin@email.com',
    nickname: 'Cerebrl'
};

现在,通常一旦用户单击保存,您就会将数据发送到服务器以进行持久化,然后您可以清空对象(例如$scope.myForm = {};)以重置表单。但是,出于某种原因,您想先构建一个数组,然后在完全完成后将整个东西发送到服务器(至少我是这么理解的)。

为此,您必须绕过JavaScript 中的ObjectsandArrays是引用类型这一事实,因此您不能将充满数据的对象推送到数组中,然后清空对象以重置表单,因为那样会清空对象在数组中也是如此,这会破坏您的数据存储。

我会亲自使用 Angular 的对象复制方法(例如angular.copy(source);)解决这个问题:http: //docs.angularjs.org/api/angular.copy这允许您制作对象的非引用副本并使用它而不会发生变异原始对象。因此,在“保存功能”中,您将拥有:

var myNewObj = angular.copy($scope.myForm);
myDataArray.push(myNewObj);
$scope.myForm = {};

这样,您就保存了完整的表单数据,将其推送到数组并清除了表单的输入数据。这回答了你的问题了吗?

于 2013-06-08T22:50:42.510 回答