在Backbone View中创建Handlebars.registerHelper时,我在哪里定义上下文(JSON对象)?

时间:2014-03-13 18:54:31

标签: json backbone.js handlebars.js

我不知道在Backbone View中的Handlebars.registerHelper函数中定义上下文(JSON对象)的位置。

当我通过$ .getJSON访问它时,我能够在控制台中呈现我的辅助函数数据,但我无法将辅助函数中的数据导入到我的模板中:

var SurveyView = Backbone.View.extend({

template: Handlebars.compile(

    '<ul>' + 

    '{{#each models}}<h3>{{attributes.name}}</h3><h4>{{attributes.question}}</h4>'+
    '<li>{{#answerList info}} {{{answers}}}{{/answerList}}</li>{{/each}}' +
    '</ul>' +
    '<button type="button" class="btn btn-danger">Next</button>' +

),

helperOne: function() {
    Handlebars.registerHelper('answerList', function(context, options) {
        var output = "";
        $.getJSON('questions', function(info) {             
            for (var i = 0; i<info.length; i++ ){
                var infos = info[i];
                for (key in infos.answers) {
                    if(infos.answers.hasOwnProperty(key)) {
                             output += '<li>' +
                    '">' + info[i].answers[key] + 
                    '</li>';
                    console.log(output);

                    }
                }
            } 

        });

        return output;  
    }); //end register      
}, 

initialize: function() {
    this.listenTo(this.collection, "reset", this.render);
},


render: function () {
    this.helperOne();
    this.$el.html(this.template(this.collection));
    return this;
}

});

1 个答案:

答案 0 :(得分:1)

尝试在Handlebars助手中进行AJAX调用并不是一件非常有效的事情。帮助程序只知道文本:帮助程序返回一段文本,它可能会成为一组DOM节点,但帮助程序无法知道DOM节点是什么,所以它不能更新页面上的任何内容。 AJAX调用从服务器返回。

你需要改变你的逻辑:

  1. 找出需要进行的AJAX调用。
  2. 执行AJAX调用。
  3. 当所有AJAX调用完成后,收集模板的数据并将其交给编译的模板函数。
  4. 将模板函数的返回值添加到DOM。
  5. 在您的情况下,您可以完全摆脱helperOne。然后,大概你有一个Answer Backbone模型和一个包含AnswerList s的Answer集合。您可以在某个地方fetchAnswerList,当它返回时,您可以更新您的视图。