简体   繁体   English

骨干MVC视图不会在同步时更新

[英]Backbone MVC view doesn't update on sync

I've been trying to learn Backbone. 我一直在尝试学习骨干网。

I set up collection of models, each of which has it's own view that should render every time the model syncs with the server. 我设置了模型集合,每个模型都有其自己的视图,每次模型与服务器同步时都应呈现该视图。 The server sends back an ID for the model. 服务器发回该模型的ID。 It's seems to be rendering before the model ID is set . 似乎设置模型ID 之前正在渲染 If you look at the console.log() output, I have it print the model's id just before it renders. 如果您查看console.log()的输出,我将在呈现之前打印出模型的ID。 I also have it print each event as it happens. 我还让它在发生每个事件时将其打印出来。 I get: 我得到:

undefined (model id)
add
change:id
change (not sure what changes here?)
sync

Also, I have it change the model's name attribute after a 2 sec pause model.save('name', 'New Name') . 另外,我在暂停2秒钟后更改了模型的名称属性model.save('name', 'New Name') This causes another sync event, but the view doesn't update . 这会导致另一个同步事件, 但是视图不会更新

Here's the working code: http://jsfiddle.net/flackend/brB7y/1/ 这是工作代码: http : //jsfiddle.net/flackend/brB7y/1/

Or see it here: 或在这里查看:

var game_library;

(function($) {

    _.templateSettings = {
        interpolate: /\{(.+?)\}/g
    };    

    var GameModel = Backbone.Model.extend({
        url: '/gh/gist/response.json/2895708/',
        name: undefined,
        initialize: function() {

            // Create a view for this model
            this.view = new GameView({model: this});

            // Sync model with server
            this.save();

            // Bind events
            this.on('sync', this.view.render());
            this.on('all', this.console);
        },
        console: function(event, model, changes) {

            console.log('['+ ++this.i +']-------------(event[:attr], model, changes)----------------');
            console.log(event);
            console.log(model);
            console.log(changes);
        },
        i: 0
    });

    var GameCollection = Backbone.Collection.extend({
        model: GameModel
    });

    var GameView = Backbone.View.extend({
        el: $('#holder'),
        template: $('#game-template').html(),
        render: function() {

            var template = _.template(this.template);
            console.log(this.model.id);
            this.$el.html(template(this.model.toJSON()));
        }
    });

    // Instantiate new game collection
    game_library = new GameCollection;

    // Add a game
    // Note: can only pass in 1 ID from gist, so only add 1 game.
    var games = [
        new GameModel({name: 'Skyrim'})
    ];

    // Note: `game_library.add(new GameModel({name: 'Skyrim'}));` does
    // not work for some reason having to do with instances...
    game_library.add(games);

    // 2 sec later...
    window.setTimeout(function() {

        game_library.get(1).save('name', 'The Elder Scrolls V: Skyrim');
    }, 2000);
})( jQuery );

Thanks for any help!!​ 感谢您的帮助!!

Remove brackets there: 拆下支架

// Bind events
this.on('sync', this.view.render/*()*/);
this.on('all', this.console);

Updated gist at http://jsfiddle.net/brB7y/2/ . 更新了要点, 网址http://jsfiddle.net/brB7y/2/ I've moved your refresh call to a local function which works. 我已将您的刷新调用移至可以正常工作的本地函数。 I'm not sure about the technical reasons behind this but it's how I've used it before. 我不确定这背后的技术原因,但这是我以前使用它的方式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM