如何在不序列化模型的情况下渲染模板数据?

时间:2013-04-26 19:54:05

标签: javascript backbone.js marionette

这就是我目前的工作方式,但我想做的是从模板渲染数据而不执行此操作(serialized_model.items [0]):

template: function(serialized_model){
        var user_data_tmpl = $("#user-data-template").html();
        var template = Handlebars.compile(user_data_tmpl);
        return template(serialized_model.items[0]);
    }

我很难得到结果,但这是完整的代码:

模特&系列:

window.UserData = {};

UserData.Model = Backbone.Model.extend();

UserData.Collection = Backbone.Collection.extend({

    model:UserData.Model,

    url: '/getUserData',

    parse: function(response) {
        return response.data;
    }

});

观点:

UserData.View = Backbone.Marionette.ItemView.extend({

   template: function(serialized_model){

        var user_data_tmpl = $("#user-data-template").html();
        var template = Handlebars.compile(user_data_tmpl);
        return template(serialized_model.items[0]);
    }

});

模板:

<script id='user-data-template' type='text/x-handlebars-template'>
    <a href="#" id="logout"> Logout </a>
    uid:{{uid}} username:{{username}} clave:{{clave}}
</script>

JSON:

{"success":true,"data":{"logged":true,"uid":14,"clave":14,"depto":9,"nivel":5},"report":null}

1 个答案:

答案 0 :(得分:1)

我们在代码库中处理此问题的方法只是拥有一个BaseView类,我们的所有视图都来自此类。这个视图有一个renderTemplate方法和一些支持方法,看起来像这样:

renderTemplate: function() {
    this.$el.html(this.templatedHtml());
    return this;
},
templatedHtml: function() {
    return this.template(this.getTemplateData());
},
getTemplateData: function() {
    return _({}).extend(this.model.toJSON());
}

我们比这更复杂,但希望你能得到这个想法。关键是,如果您在renderTemplate类上自己构建BaseView方法,那么您可以创建新视图...

var YourView = BaseView.extend({
    template: yourCompiledTemplate
});

var yourViewInstance = new YourView({model: someModel});
// Apply template to yourViewInstance:
yourViewInstance.renderTemplate();

那样:

  • 一切都自动发生
  • 你不必重复任何事情
  • 如果你想添加更多(例如你希望能够将模板定义为字符串,或者你想在脚本标签中定义它们并指定那些标签的ID,并让你的视图编译成一个你的把手模板)它非常容易添加