Javascript 通过角点保存嵌套数据

Javascript 通过角点保存嵌套数据,javascript,angularjs,Javascript,Angularjs,我试图将表单的内容保存到分层数据结构中: $scope.milestones = [ {milestoneName: "milestone 1", id:"milestoneOne", headingID:"headingOne", panelClass:"in", tasks:[ { taskSubject:"Get cost agreement confirmation", category:"#7FFF

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

$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"}
    ]}
];
我使用ng repeat来显示里程碑,然后在每个里程碑中我都有任务。每个里程碑都可以通过一个基本html表单添加一个或多个任务,其中每个输入对应于推送中的一个值

以下是定义推送的脚本:

$scope.addTask = function(index){
    $scope.milestones.tasks.push({
        taskSubject: $scope.index.formTaskSubject,
        category: $scope.index.formCategory,
        dueDate: $scope.index.formDate,
        repeat: $scope.index.formRepeat,
        assignee: $scope.index.formAssignee,
        estHours: $scope.index.formEstTime
        })
    };

我当前收到一个错误:TypeError:无法读取未定义的属性“push”

此错误意味着您试图对不存在的对象调用方法
push
。由于
$scope.millements
是一个数组,因此需要指定要将任务添加到该数组中的元素

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

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

<a class="btn btn-primary" ng-click="addTask()">Save</a>
在控制器中:

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

我决定创建一个plunk,让它更容易沟通。我做了这个更改,现在任务也会出现同样的错误。单击“添加任务”按钮下的“里程碑1”内的保存将生成ErrorThank@featherz,plunker帮助。请注意,在
ng click=“addTask()”
中,您没有传递任何参数,但是
函数addTask(milestoneIndex){…}
需要一个参数
addTask($index)
是您需要的
ng click
的值,但页面的结构方式使其很容易中断(注释中没有足够的空间解释原因)。考虑在<代码>里程碑> /代码>对象本身,而不是数组的索引。我想我已经把这一切都弄清楚了,但似乎无法使它将数据内容张贴回页面。即使填写了表单,它也会发布空数据。有什么想法吗?它与作用域有关&表单字段是在哪个作用域中定义的<代码>$scope指控制器的作用域,但
ng repeat=“里程碑中的里程碑”
为每个
里程碑创建一个新的作用域。因此,
$scope.formDate
不存在,因为存在多个
formDate
s,每个
里程碑一个。您需要将这些值中的每一个以值的形式传递到
addTask
()。或者,如果您很勇敢,您可以尝试为里程碑面板创建一个:
<div ... ng-repeat="milestone in milestones" ...>
  ...
  <a ... ng-click="addTaskTo(milestone)" ...>Save</a>
  ...
$scope.addTaskTo = function(milestone) {
  milestone.tasks.push(...);