首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DOM完成之前呈现调用-流星火焰

在DOM完成之前呈现调用-流星火焰
EN

Stack Overflow用户
提问于 2014-03-27 20:18:41
回答 1查看 1.5K关注 0票数 5

我正在使用json创建一个动态表单,并尝试使用jquery验证插件向输入字段添加验证规则。

Json结构和助手方法是:

代码语言:javascript
复制
var fields = [{
    label: "Name",
    type: {name: 'STRING'},
    validationRules: {
        required: true,
        maxlength: 100,
        minlength: 3
    }
},{
    label: "Currency",
    type: {name: 'CHECKBOX'},
    defaultValue: ['USD', 'INR'],
    validationRules: {
        required: true
    },
    sourceCollection: 'oNLFfi4L3zgNLhScv',
}] ;

Template.eventCreate.helpers({
    fields: function(){
        console.log("calling fields");
        fields.forEach(function(field, index){
            field.sourceCollectionData = StaticLists.find({_id: field.sourceCollection});
        });
        return fields;
    }
});

模板看起来如下:

代码语言:javascript
复制
<template name="eventCreate">
    <form id="newEventForm" class="form-horizontal">
        {{#each fields}}
            <div class="form-group">
                <label class="col-xs-2 control-label">{{label}}</label>
                <div class="col-xs-6">
                    {{#if equals type.name 'STRING'}}
                        <input name="{{label}}" id="{{label}}" class="form-control" placeholder="Enter {{label}}" value="{{defaultValue}}" />
                    {{/if}}
                    {{#if equals type.name 'CHECKBOX'}}
                        {{#each sourceCollectionData}}
                            {{#if isActive}}
                                <div class="col-xs-2 checkbox">
                                    <label class="checkbox-inline">
                                        <input type="checkbox" name="{{../label}}" id="{{../label}}" value="{{name}}" {{checked ../defaultValue}}> {{name}}
                                    </label>
                                </div> 
                            {{/if}}                               
                        {{/each}}                         
                    {{/if}}
                </div>               
            </div>
        {{/each}}
    </form>
</template>

现在,我正在尝试在呈现的方法中添加验证规则:

代码语言:javascript
复制
Template.eventCreate.rendered = function(){
    $('#newEventForm').validate({
       ....
    });

    fields.forEach(function(field, index){
        if(field.validationRules){
            $('#'+field.label).rules('add', field.validationRules);
        }
    });
}

它在输入文本的情况下工作,但会为复选框抛出异常,因为复选框DOM仍未布局,并且没有id“通货”的元素。

我认为在流星火焰渲染只有在DOM渲染完成时才会被调用一次。虽然在这里只调用一次,但在DOM呈现完成之前。

编辑

早些时候,我在js文件本身中硬编码JSON,现在我从mongo检索它。

但似乎呈现回调只在第一次调用,而不是每次mongo集合更改时调用(这反过来更新DOM)。

代码语言:javascript
复制
Template.eventCreate.helpers({
    fields: function(){
        var template = EventTemplate.findOne({name: 'Job Template'});
        console.log("template", template);
        if(template){
            Session.set("template", template);
            template.fields.forEach(function(field, index){
               field.sourceCollectionData = StaticLists.find({_id: field.sourceCollection});
            });
            return template.fields;
        }        
    }
});

Template.eventCreate.rendered = function(){
    $('#newEventForm').validate({
        ...
        ...
    console.log("rendering main template");

   addValidationRules(Session.get('template'));
}

现在控制台输出类似于:

代码语言:javascript
复制
template undefined event_create.js?bfeba9389401dac358bc313bd9d4205818e356a1:52
rendering main template event_create.js?bfeba9389401dac358bc313bd9d4205818e356a1:98
template Object {_id: "iFDndmjavtFN8AdGQ", name: "Job Template", description: "Job Template",     fields: Array[13]}

这表明(即使在js脚本中有一个断点)(即使在js脚本中有一个断点),当脚本加载模板时,没有在前端呈现输入字段,而是调用呈现回调时,就会调用它。现在,当模板填充数据时,将呈现输入字段,但不会再次调用回调。

EN

回答 1

Stack Overflow用户

发布于 2014-04-01 16:34:01

推荐模式是将{{#各}}块的contents放在单独的模板中,并点击这些模板的呈现事件。

顺便说一句,不再需要Meteor.defer了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22698340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档