2014-10-27 65 views
0

我有一个x-template部分,其中包含一个调查元素(基本上是一个文本字段和单选按钮)。当用户根据以前存储的部分加载屏幕时,数据库将通过jSON对象发送到UI,然后使用JSON对象填充此调查模板。动态修改DOM并添加到文档

我能够动态创建整个模板,并且没有任何问题。但是,当我尝试用JSON对象的值填充模板时 - 我遇到了问题。任何帮助表示赞赏我可能做错了什么。

感谢

Fiddle here

的Javascript:

$(document).on('click', '.btn-toggle', function() { 
    $(this).find('.btn').toggleClass('active'); 

    if ($(this).find('.btn-primary').size() > 0) { 
     $(this).find('.btn').toggleClass('btn-primary'); 
    } 

    $(this).find('.btn').toggleClass('btn-default'); 
}); 

var questions = [{ 
    "id": "6", 
     "survey_id": "23", 
     "name": "How are you? Not here?", 
     "subtext": "", 
     "type": "1", 
     "required": "N" 
}, { 
    "id": "7", 
     "survey_id": "23", 
     "name": "Where are you?", 
     "subtext": "", 
     "type": "1", 
     "required": "Y" 
}]; 


for (var key in questions) { 
    question = questions[key]; 
    var questionTemplate = $('#textSurveyTemplate'); 
    $('#textSurveyTemplate').find('input#question-name').attr('value', question.name); 
    $('.test').append($('#textSurveyTemplate').text()); 
} 

HTML代码:

<script id="textSurveyTemplate" type="text/x-tmpl"> 
    <div class = "text-question" > 
     <div class = "form-group survey-form-group" style = "border-bottom: none;"> 
      <label class = "col-md-2 control-label" > Question </label> 
      <div class="col-md-9"> 
       <input type="text" class="form-control" id="question-name" name="qname" placeholder="Question" value="" data-type="1" /> 
      </div> 
     </div> 
     <div class="form-group survey-form-group"> 
      <label class="col-md-2 control-label">Required</label> 
      <div class = "col-md-9 btn-group btn-toggle" > 
       <button type = "button" class = "btn btn-xs btn-default" > Y </button> 
       <button type="button" class="btn btn-xs btn-primary active">N</button > 
      </div> 
     </div > 
    </div> 
</script> 
<div class="test">Test Area</div> 
+0

会像车把上的模板库中使用的? http://handlebarsjs.com/ – 2014-10-27 02:38:29

回答

0

固定它 - 诀窍是用appendTo和新追加的元件分配给用于将来操纵的变量。显然,当一个DOM被附加到另一个DOM元素时,现有的引用会被清除,这就是为什么它没有工作。我更新了小提琴here

更新后的JavaScript代码如下 - 注意使用appendTo和操纵从那里起

$(document).on('click', '.btn-toggle', function() { 
    $(this).find('.btn').toggleClass('active'); 

    if ($(this).find('.btn-primary').size() > 0) { 
     $(this).find('.btn').toggleClass('btn-primary'); 
    } 

    $(this).find('.btn').toggleClass('btn-default'); 
}); 

var questions = [{ 
    "id": "6", 
     "survey_id": "23", 
     "name": "How are you? Not here?", 
     "subtext": "", 
     "type": "1", 
     "required": "N" 
}, { 
    "id": "7", 
     "survey_id": "23", 
     "name": "Where are you?", 
     "subtext": "", 
     "type": "1", 
     "required": "Y" 
}]; 


for (var key in questions) { //questions is defined in edit.ctp 
    question = questions[key]; 
    var template = $('#textSurveyTemplate').html(); 
    var curr = $(template).appendTo($('.test')); 
    curr.find('input#question-name').val(question.name); 
} 
0

我遇到了类似的问题在几个星期前,结束了使用以下插件。它非常轻巧(6kbs),简单地工作。

https://code.google.com/p/jquery-load-json/

+0

插件是一个很好的资源 - 谢谢,但它不能解决我的问题。我能够拿起HTML模板并将其插入文档的不同部分。我也能够查找所有的JSON值,但是在将模板追加到主HTML文档之前,我无法在我的HTML模板中填充来自JSON的值 – ChicagoSky 2014-10-27 01:11:24

+0

我会进一步了解一下。有一件事你可以在过渡时看看,因为你有两次id =“问题名”。如果重复,您将无法根据ID进行填充。 – AshHimself 2014-10-27 01:41:14

1

我第一次尝试的东西取代您的最终循环是这样的:

for (var key in questions) { 
    question = questions[key]; 
    var questionTemplate = $('.textSurveyTemplate').html(); 
    $('.test').append(questionTemplate).find('input#question-name').attr('value', question.name); 
} 

但是,这将在每次迭代中所有生成的元素替换,所以我们必须在标识添加到每一个元素以取代其适当的价值。

for (var i=0 ; i<questions.length ; i++) { 
    question = questions[i]; 
    var questionTemplate = '<div id="'+i+'" class="text-question">' + $('.textSurveyTemplate').html() + '</div>'; 
    $('.test').append(questionTemplate); 
    $('#'+i).find('input#question-name').attr('value', question.name); 
}