如何将表单错误渲染回模板?

时间:2015-02-13 07:51:16

标签: javascript jquery meteor

所以我对MeteorJS不熟悉,并且正在为表单实现错误处理。我正在使用简单验证,因此我得到了错误键列表和错误消息。

有没有办法可以在控制器事件处理程序中返回它们,以便我可以在{{}}标记中对它们进行评估?

假设我有一个简化的处理程序

//New thread form on forum page
Template.forum_details.events({
  "submit .new-thread": function (event) {
     var errors = [{field: 'title',error: 'title is required'}]


    // Prevent default form submit
    return false;
  }
});

我可以在模板中渲染这些错误,还是需要使用jquery / etc?

我希望能够修改模板数据并使用e,g。

进行评估

{{#each errors}}

编辑:

感谢下面的回答,我能够提出以下内容,效果很好!

errors.js:

throwError = function(field,message) {  
    //format the 'required' error type to make it look a little more readable...    
    if(message == 'required')
    {
        message = field + " is required.";  
    }
  Errors.insert({field:field,message: message});
};
if (Meteor.isClient) {


Template.errors.helpers({
  errors: function() {
    return Errors.find();
  }
});

Template.registerHelper('hasError', 
    function(key)
    {
        //console.log("Checking for key:" + key);
        if(Errors.find({field:key}).count() > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
);


Template.error.helpers({
    //Return the error for the specified key
    error:  function(key)
    {
    return Errors.findOne({field:key});
    },
    message: function(key)
    {
        //console.log("Finding message for key: " + key);
        //console.log(key);
        Errors.findOne({field:key}).message;
        return Errors.findOne({field:key}).message;
    }   
}); 
}   

Errors.html

<template name="errors">
  <div class="errors">
    {{#each errors}}
      {{> error}}
    {{/each}}
  </div>
</template>

<template name="error">

{{#if hasError key }}
  <div class="alert alert-danger" role="alert">
    <button type="button" class="close" data-dismiss="alert">&times;</button>
    {{message key}}
  </div>
  {{/if}}
</template>

然后在我的实际形式中,我称之为:

<div class="form-group title">
    <label for="title">Thread Title</label>
    <input  class="form-control" type="text" name="title" placeholder="Thread Title" />
      <span class="help-block title" name="title"></span>

        {{>error  key='title'}}          
  </div>

如果存在则显示错误消息,如果不存在则显示任何错误消息。

还可以通过传入字段的“键”来为文本框,文本区域,数字输入等创建模板。

2 个答案:

答案 0 :(得分:1)

这是一个很棒的方案来处理这类事情,值得更好地了解:

http://viewmodel.meteor.com/

让你的头围绕它需要一点时间,但是一旦你使用它,你就会回去。

答案 1 :(得分:1)

你可以像这样管理错误(我从Discover Meteor Erros Chapter获取代码。)

首先创建一个新的空集合

Errors = new Mongo.Collection(null); //we use the keyword null, when we don't want the data get stored on the database

第二次创建此功能。

throwError = function(message) {
  Errors.insert({message: message});
};

<强>第三即可。使用{{&gt;}} yield helper

调用模板名称
<template name="layoutExample">
  <div class="container">
    {{> header}}
    {{> errors}} <!-- Here or whatever you want to top the error messages -->
    <div id="main" class="row-fluid">
      {{> yield}}
    </div>
  </div>
</template>

使用此数据创建错误模板。

<template name="errors">
  <div class="errors">
    {{#each errors}}
      {{> error}}
    {{/each}}
  </div>
</template>

<template name="error">
  <div class="alert alert-danger" role="alert">
    <button type="button" class="close" data-dismiss="alert">&times;</button>
    {{message}}
  </div>
</template>

不要忘记errors助手

Template.errors.helpers({
  errors: function() {
    return Errors.find();
  }
});

和上次测试。

throwError("I'm an error!");

不,你可以在回调中的应用程序上使用它,或者你可以抛出任何错误。

实施例

 Example.insert({dummyData:"im a dummy"},function(err,result){
    if(err){
     return throwError(err.reason);
    }else{
     console.log("Well the insert was just fine")
    }
  })