通过角度保存嵌套数据

时间:2015-06-26 15:41:56

标签: javascript angularjs

我试图将表单内容保存为分层数据结构:

Schema Builder

我使用ng-repeat显示里程碑,然后在每个里程碑内我都有任务。每个里程碑都可以通过基本的html表单添加一个或多个任务,其中每个输入对应于推送中的值。

这是定义推送的脚本:

$scope.milestones = [
    {milestoneName: "milestone 1",
    id:"milestoneOne",
    headingID:"headingOne",
    panelClass:"in",
    tasks:[
        {
        taskSubject:"Get cost agreement confirmation",
        category:"#7FFF00",
        dueDate:"July 5, 2015",
        repeat: true,
        assignee:"Jiman Ilitad",
        estHours:"3"},
        {
        taskSubject:"Get cost agreement confirmation",
        category:"#7FFF00",
        dueDate:"July 5, 2015",
        repeat: true,
        assignee:"Jiman Ilitad",
        estHours:"3"}
    ]}
];

我目前收到错误:TypeError:无法读取属性' push'未定义的

1 个答案:

答案 0 :(得分:2)

此错误表示您尝试在不存在的内容上调用方法push。由于$scope.milestones是一个数组,因此您需要指定您尝试将任务添加到该数组中的哪个元素。

根据您的plunker,您只需使用指定要修改的里程碑索引的附加参数调用addTask()

ng-click中,将索引传递给里程碑。例如,更改:

<a class="btn btn-primary" ng-click="addTask()">Save</a>

要:

<a class="btn btn-primary" ng-click="addTask($index)">Save</a>

以上假设$index$scope.milestones数组的索引,由ng-repeat="milestone in milestones"分配。如果你嵌套ng-repeat,它可以很容易地改变,破坏你的代码。

要避免这种情况,只需将milestone对象本身直接传递到addTask

在您的HTML中:

<div ... ng-repeat="milestone in milestones" ...>
  ...
  <a ... ng-click="addTaskTo(milestone)" ...>Save</a>
  ...

在您的控制器中:

$scope.addTaskTo = function(milestone) {
  milestone.tasks.push(...);