Backbone + Handlebars - >在初始化或渲染中加载数据?

时间:2013-09-12 09:11:23

标签: jquery backbone.js handlebars.js

我正在使用带有Handlebars的BackboneJS作为我的模板。几乎在任何时候都能正常工作。 但是在一个问题上,它没有我想要的那么好。

在加载页面时,我需要从数据库中获取一些信息以加载到页面中(使用把手)。我正在使用jQuery的$ .ajax()来获取JSON对象中的数据。

首先,我在Backbone View的initialize方法中运行$ .ajax()。 但是,有时(并非总是)数据没有出现在我的模板中。

作为测试,我现在将$ .ajax()放入Backbone View的render方法中。 我没有再看到这个问题,但不幸的是,这并不意味着它不存在,因为它不会每次都出现。

编辑:我刚刚再次遇到同样的问题,所以不幸的是将它放在渲染中并没有帮助。

那么我应该如何解决这个问题?

只是为了它的乐趣......这是代码:

var OF = OF || {};

OF.ReferrerView = Backbone.View.extend({

    el: '#content',

    initialize: function() {

        if (!OF.address || !OF.address.isValid()) {
             OF.router.navigate('step/1', {trigger: true});
        }

        OF.customerReferrer = OF.customerReferrer || new OF.CustomerReferrer();

    }

    render: function() {

        //save this in that ;)
        var that = this;

        var sendObj = {
            "selectAdult": OF.address.adultTreatment
        };

        //get referrer info
        $.ajax({
            url: "php/fakeAPI/referrer.php",
            type: "POST",
            dataType: "json",
            data: sendObj,
            success: function(data) {
                OF.customerReferrer.referrerTypes = data.referrerTypes;
            }

        });

        OF.template.get('step4-step4', function(data) {

            //set the source en precompile the template
            var htmlSource = $(data).html();
            var template = Handlebars.compile(htmlSource);

            //fill template with object or ''
            var compiled = template(OF.customerReferrer);

            //now place the completely compiled html into the page
            that.$el.html(compiled);

        });

    }
});

1 个答案:

答案 0 :(得分:1)

不要在视图中发出ajax请求。最好不要使用它们,而是使用正确配置的Model或Collection子类,但如果必须进行手动ajax调用,至少在模型中进行。然后让您的视图绑定到模型上的同步/更改事件并进行适当的渲染。