过去3天我一直在试图使用你生成的crud模块将一个新的评论对象推送到我的评论数组中。
这是我的评论模式的server.model,我将其用作子文档:
var CommentsSchema = new Schema({
comment: {
type: String,
default: ''
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
created: {
type: Date,
default: Date.now
}
});
mongoose.model('Comments', CommentsSchema);
这是任务架构,其中包含注释架构:
var TaskSchema = new Schema({
name: {
type: String,
default: '',
required: 'Please fill Task name',
trim: true
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
//comments : [{
// text: { type: String },
// created: { type: Date, default: Date.now },
// user: { type: Schema.ObjectId, ref: 'User' }
//}]
comments: [CommentsSchema]
});
mongoose.model('Task', TaskSchema);
我可以使用mongodb shell手动将注释插入到任务中,如下所示:
db.tasks.update({"_id" : ObjectId("5711856735e9cb1938845048")},{ $addToSet: { comments: { "comment" : "i am also a comment" } } } )
然而,我正在努力设置正确的函数,使用js / angularjs中的函数插入客户端的任务。
我已经设置了一个表单来添加新评论:
<form name="vm.form.taskForm" class="form-horizontal" ng-submit="vm.newCo(vm.form.taskForm.$valid)" novalidate>
<input type="text" ng-model="vm.task.comments.comment" name="comments" id="comments" placeholder="ask a question about this task">
<button type="submit">Add a comment</button>
</form>
我已经像我这样更新了我的app.routes:
app.route('/api/tasks/:taskId').all(tasksPolicy.isAllowed)
.get(tasks.read)
.put(tasks.update)
.delete(tasks.delete)
.put(tasks.newCo); // this is the new function I am trying to add
并尝试在我的server.controller中设置功能
exports.newCo = function(req, res) {
var task = req.task;
var task_id = req.task._id;
Task.findByIdAndUpdate(
task_id,
{ $push : { comments: req.task.comments }},
{ safe: true, upsert: true},
function(err) {
if(err) {
console.log(err, Task);
}
return res.json(Task);
}
)
}
我不太明白如何与client.controller通信我的client.controller以执行更新我的任务的功能并将注释推送到数组中。
我对client.controller的最新尝试是:
function newCo(isValid) {
if (!isValid) {
$scope.$broadcast('show-errors-check-validity', 'vm.form.taskForm');
return false;
}
if (vm.task._id) {
vm.task.$newCo(successCallback, errorCallback);
} else {
vm.task.$save(successCallback, errorCallback);
}
function successCallback(res) {
$state.go('tasks.view', {
taskId: res._id
});
}
function errorCallback(res) {
vm.error = res.data.message;
}
}
如果有人能指出我正确的方向,我会如此,非常感激!谢谢大家!
例如,这就是remove()的工作方式
client.controller
// Remove existing Task
function remove() {
if (confirm('Are you sure you want to delete?')) {
vm.task.$remove($state.go('tasks.list'));
}
}
server.controller
exports.delete = function(req, res) {
var task = req.task;
task.remove(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(task);
}
});
};
server.routes.js
app.route('/api/tasks/:taskId').all(tasksPolicy.isAllowed)
.get(tasks.read)
.put(tasks.update)
**.delete(tasks.delete)**
最后,html视图:
<a class="btn btn-primary" data-ng-click="vm.remove()">
<i class="glyphicon glyphicon-trash"></i>
</a>
答案 0 :(得分:1)
您可以按照以下流程操作:
在html中:
您不需要通过vm.form.taskForm.$valid
newCo
功能可以从表单中查看。如果表单无效ng-disabled="vm.form.taskForm.$invalid"
,则提交按钮可以保持禁用状态。也可以使用ng-model="vm.task.newComment"
代替ng-model="vm.task.comments.comment"
,因为您要添加新评论,因此无需使用comments.comment
。所以可以使用html:
<form name="vm.form.taskForm" class="form-horizontal" ng-submit="vm.newCo()" novalidate>
<input type="text" ng-model="vm.task.newComment" name="comments" id="comments" placeholder="ask a question about this task">
<button type="submit" ng-disabled="vm.form.taskForm.$invalid">Add a comment</button>
</form>
我猜您使用了controller as
ng-controller="yourCtrl as vm"
或controllerAs: 'vm'
使用的路线提供商
在您的控制器中:
var vm = this;
vm.task = task //predefined
vm.newCo = function() {
// used $http.put('/api/tasks/21' according to your server side route
$http.put('/api/tasks/21', {
comment: vm.task.newComment;
}).then(successCallback, errorCallback); //say 21 is taskId
function successCallback(res) {
$state.go('tasks.view', {
taskId: res.data._id
});
}
function errorCallback(res) {
vm.error = res.data.message;
}
};
服务器端控制器:
exports.newCo = function(req, res) {
Task.findOneAndUpdate({_id: req.params.taskId},
{
"$push": {
comments: req.body.comment
}
}, {
new: true //to return updated document
})
.exec(function(error, task) {
if (error) {
return res.status(400).send({message: 'Failed to add comment due to invalid params!'});
}
return res.status(200).send(task);
});
};
并且在您的架构中应使用Schema.Types.ObjectId
而不是Schema.ObjectId
user: {
type: Schema.Types.ObjectId,
ref: 'User'
}