如何在Backbone JS中渲染json fetch?

时间:2014-02-20 23:33:21

标签: json jquery-mobile backbone.js jsonp

我是BackboneJS的新手,我无法从JSONP渲染信息。如果我将数据放入data.json并获取它,则计数出现在控制台中,但是当我使用JSONP时,永远不会重新渲染。 我不知道是否有某种延迟来获取数据,但是“更改”和“重置”事件不会被集合触发以重新渲染视图。 我的代码是下一个:

//集合

define([
'underscore',
'backbone',
'models/EstablecimientoModel'],function(_, Backbone, EstablecimientoModel){

var EstablecimientoCollection = Backbone.Collection.extend({
    model: EstablecimientoModel,

    initialize: function(models, options) {
        console.log("Establecimiento initialize");
    },

    url: function() {
        return '../js/establecimientos.json';  
        //return 'http://localhost:3000/establecimiento';
    },

    parse: function(data) {
        console.log("End of loading data " + JSON.stringify(data) + " datos");
        return data;   
    },
});

return EstablecimientoCollection;

});

//路由器

define([
    'jquery',
    'underscore',
    'backbone',
    'views/establecimiento/EstablecimientoView',
    'jqm'
], function($, _, Backbone,EstablecimientoView) {
    'use strict';
    var Router = Backbone.Router.extend({
        //definition of routes
        routes: {
            'nearMe' : 'nearMe',
        },
        nearMe: function(actions) {
            var estaColl = new EstablecimientoCollection();

            var establecimientoView = new EstablecimientoView({ collection: estaColl });
            //estaColl.fetch();
            //establecimientoView.render();
            this.changePage(establecimientoView);
        },
        init: true,
        changePage: function(view) {
            //add the attribute data-role="page" for each view's div
            $(view.el).attr('data-role','page');
            view.render();
            // append to the DOM
            $('body').append($(view.el));
            var transition  = $.mobile.defaultPageTransition;

            if(this.firstPage) {
                transition = 'none';
                this.firstPage = false;
            }

            // Remove page from DOM when it’s being replaced 
            $('div[data-role="page"]').on('pagehide', function (event, ui) { 
                $(this).remove();
            });

            $.mobile.changePage($(view.el), { transition: transition, changeHash: false });   

        } // end of changePage()
    });

    return Router;
});

//查看

define([
    'jquery',
    'underscore',
    'backbone',
    'collections/EstablecimientoCollection',
    'text!templates/establecimiento/establecimientoTemplate.html'
],function($, _, Backbone, EstablecimientoCollection, establecimientoTemplate) {

    var EstablecimientoView = Backbone.View.extend({
        initialize: function() {
            var self = this;

            _.bindAll(this,"render");
            this.collection.on("change",self.render);
            this.collection.fetch({ dataType: 'jsonp', success: function(){ self.render() }});

        }, //end of initialize()

        template: _.template(establecimientoTemplate),        

        render: function(eventName) {
            console.log("render");
            console.log(this.collection.length);

            return this;
        }, //end of render()
    });

    return EstablecimientoView;
});

1 个答案:

答案 0 :(得分:0)

获取数据时,请确保为fetch调用设置dataType。 Fetch正在包装一个jQuery / Zepto ajax调用,所以你需要设置与那些相同的参数。

this.collection.fetch({
    reset: true,
    dataType: 'jsonp',
    success: function () {
        // do stuff
    }
});

另外,我会让你的视图监听集合发布的事件,而不是直接从fetch的成功回调中调用视图的渲染。