如何传递子文档数组字段值

我已经使用MEAN(Mongodb,Express,Angular,Node)编写了一个基本的待办事项应用程序。 后端ie。 Node.js应用程序的一部分工作正常,并已使用postman rest api客户端进行validation。 但我无法正确传递从客户端到后端的值,可能是我的语法是不正确的,我无法弄清楚。此外,我无法获得这些子文档数组字段值显示在客户端和每次它返回一个空的数组字段。

后端部分截图,它工作正常: 截图1 截图2

我已经把所有的代码上传到git公共仓库,你可以下载并尝试完整的应用程序仓库

或者在这里你可以检查下面的angular度控制器,HTML和其他相关的后端代码。

发布方法:

api.post('/tasks', function (req, res) { var task = {}; task.tasktype = req.body.tasktype; //category : [req.body.category], task.taskinfo = []; for (var i = 0; i < req.body.taskInfo.length; i++) { console.log(i); var taskInfo = new TaskInfo(req.body.taskInfo[i]); task.taskinfo.push(taskInfo); console.log(task); } var taskObj = new Task(task); taskObj.save(function (err) { if (err) { res.send(err); return; } res.json({ message: 'Task has been created' }) }); }); 

task.js模型

 var mongoose = require('mongoose'); var TaskInfoSchema = require("./taskinfo.js").TaskInfoSchema var Schema = mongoose.Schema; // Task schema var taskSchema = mongoose.Schema({ tasktype : {type: String}, createdon : {type: Date, default: Date.now}, updatedon : {type: Date}, taskinfo : [TaskInfoSchema] }); module.exports = mongoose.model('Task', taskSchema); taskSchema.pre('save',function(next){ this.updatedon = new Date() next(); }); 

taskinfo.js模型:

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var taskInfo = mongoose.Schema({ isactive:{type:Boolean}, taskobject:{type:String}, taskdetails:{type:String}, iscompleted:{type:Boolean} },{ _id :true,// false }); var TaskInfo = mongoose.model('TaskInfo', taskInfo); module.exports.TaskInfo = TaskInfo; module.exports.TaskInfoSchema = taskInfo; 

任务控制器:

 $scope.addTask = function(){ $http.post('/api/tasks',$scope.task).success(function(response){ window.location.href='/#tasks'; }); } 

addtask html:

 <h2 class="sub-header">Tasks</h2> <div class="table-responsive" ng-init="getTasks()"> <table class="table table-striped"> <thead> <tr> <th>#</th> <th>Task Type</th> <th>IsActive</th> <th>Task Object</th> <th>Task Details</th> <th>Is Completed</th> <th></th> </tr> </thead> <tbody> <tr ng-repeat="task in tasks"> <td>{{task._id}}</td> <td>{{task.tasktype}}</td> <td>{{task.taskInfo.isactive}}</td> <td>{{task.taskInfo.taskobject}}</td> <td>{{task.taskInfo.taskdetails}}</td> <td>{{task.taskInfo.iscompleted}}</td> <td><a href="#/tasks/details/{{task._id}}" class="btn btn-primary">Details</a> <a href="#/tasks/edit/{{task._id}}" class="btn btn-default">Edit</a> <button ng-click="deleteTask(task._id)" class="btn btn-danger">Delete</a></td> </tr> </tbody> </table> </div> </div> </div> </div> 

正如它写在这里 :

子文件享有与正常文件相同的function。 唯一的区别是它们不是单独保存,只要保存顶级父文档即可保存。

 var Parent = mongoose.model('Parent', parentSchema); var parent = new Parent({ children: [{ name: 'Matt' }, { name: 'Sarah' }] }) parent.children[0].name = 'Matthew'; parent.save(callback); 

所以你应该改变你保存你的任务和taskinfo模型的方式。 在您的api.js文件中更改:

 task.tasktype = req.body.tasktype; //category : [req.body.category], task.taskinfo = []; for (var i = 0; i < req.body.taskInfo.length; i++) { console.log(i); var taskInfo = new TaskInfo(req.body.taskInfo[i]); task.taskinfo.push(taskInfo); console.log(task); } var taskObj = new Task(task); 

至:

 task.tasktype = req.body.tasktype; var taskObj = new Task(task); taskObj.taskinfo = req.body.taskInfo; 

并改变你的观点:

 <tr ng-repeat="task in tasks"> <td>{{task._id}}</td> <td>{{task.tasktype}}</td> <td>{{task.taskInfo.isactive}}</td> <td>{{task.taskInfo.taskobject}}</td> <td>{{task.taskInfo.taskdetails}}</td> <td>{{task.taskInfo.iscompleted}}</td> <td><a href="#/tasks/details/{{task._id}}" class="btn btn-primary">Details</a> <a href="#/tasks/edit/{{task._id}}" class="btn btn-default">Edit</a> <button ng-click="deleteTask(task._id)" class="btn btn-danger">Delete</a></td> </tr> 

至:

 <tr ng-repeat="task in tasks"> <td>{{task._id}}</td> <td>{{task.tasktype}}</td> <td>{{task.taskinfo[0].isactive}}</td> <td>{{task.taskinfo[0].taskobject}}</td> <td>{{task.taskinfo[0].taskdetails}}</td> <td>{{task.taskinfo[0].iscompleted}}</td> <td><a href="#/tasks/details/{{task._id}}" class="btn btn-primary">Details</a> <a href="#/tasks/edit/{{task._id}}" class="btn btn-default">Edit</a> <button ng-click="deleteTask(task._id)" class="btn btn-danger">Delete</a></td> </tr> 

PS:检查你的github回购拉请求。