我试图将表单内容保存为分层数据结构:
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'未定义的
答案 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(...);