当前位置:K88软件开发文章中心编程语言JavaScriptMeteor → 文章内容

Meteor 错误

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 15:28:56

tId = Posts.insert(post); return { _id: postId }; }});再次,用户正常情况下不必看到“你必须 为你的帖子填写标题和 URL”的消息。这仅会在当用户想绕过我们煞费苦心创建的用户界面而直接使用浏览器的情况下,才会显示。为了测试,打开浏览器控制台,输入一个没有 URL 的帖子:Meteor.call('postInsert', {url: '', title: 'No URL here!'});如果我们完成得顺利的话,你会得到一堆吓人的代码 和“你必须为你的帖子填写标题和 URL”的消息。编辑验证为了更加完善,我们为帖子编辑表单添加相同的验证。代码看起来十分相似。首先,是模板:<template name="postEdit"> <form class="main form"> <div class="form-group {{errorClass 'url'}}"> <label class="control-label" for="url">URL</label> <div class="controls"> <input name="url" id="url" type="text" value="{{url}}" placeholder="Your URL" class="form-control"/> <span class="help-block">{{errorMessage 'url'}}</span> </div> </div> <div class="form-group {{errorClass 'title'}}"> <label class="control-label" for="title">Title</label> <div class="controls"> <input name="title" id="title" type="text" value="{{title}}" placeholder="Name your post" class="form-control"/> <span class="help-block">{{errorMessage 'title'}}</span> </div> </div> <input type="submit" value="Submit" class="btn btn-primary submit"/> <hr/> <a class="btn btn-danger delete" href="#">Delete post</a> </form></template>然后是模板 helper:Template.postEdit.onCreated(function() { Session.set('postEditErrors', {});});Template.postEdit.helpers({ errorMessage: function(field) { return Session.get('postEditErrors')[field]; }, errorClass: function (field) { return !!Session.get('postEditErrors')[field] ? 'has-error' : ''; }});Template.postEdit.events({ 'submit form': function(e) { e.preventDefault(); var currentPostId = this._id; var postProperties = { url: $(e.target).find('[name=url]').val(), title: $(e.target).find('[name=title]').val() } var errors = validatePost(postProperties); if (errors.title || errors.url) return Session.set('postEditErrors', errors); Posts.update(currentPostId, {$set: postProperties}, function(error) { if (error) { // 向用户显示错误消息 throwError(error.reason); } else { Router.go('postPage', {_id: currentPostId}); } }); }, 'click .delete': function(e) { e.preventDefault(); if (confirm("Delete this post?")) { var currentPostId = this._id; Posts.remove(currentPostId); Router.go('postsList'); } }});就像我们为帖子提交表单所做的,我们也想在服务器端验证帖子。请记住我们不是在用一个方法去编辑帖子,而是直接从客户端的 update 调用。这意味着我们必须添加一个新的 deny 回调函数://...Posts.deny({ update: function(userId, post, fieldNames, modifier) { var errors = validatePost(modifier.$set); return errors.title || errors.url; }});//...注意的是参数 post 是指已存在的帖子。我们想验证更新,所以我们在 modifier 的 $set 属性中调用 validatePost(就像是 Posts.update({$set: {title: ..., url: ...}}))。这会正常运行,因为 modifier.$set 像整个 post 对象那样包含同样两个 title 和 url 属性。当然,这也的确意味着只部分更新 title 或者 url 是不行的,但是实践中不应有问题。你也许注意到,这是我们第二个 deny 回调。当添加多个 deny 回调时,如果任何一个回调返回 true,运行就会失败。在此例中,这意味着 update 只有在面向 title 和 url 两个字段时才会成功,并且这些字段不能为空。

上一页  [1] [2] [3] 


Meteor 错误