初始化后的骨干渲染 - 初始化get触发到早期?

时间:2013-07-15 15:03:33

标签: backbone.js initialization render

我有一个div#游戏。 在这里,我想要从服务器出现一些数据。 因此,当我使用初始化函数时,我通过ajax调用在我的游戏模型中从我的服务器请求数据。

Game = Backbone.View.extend(
{
    id: 'game',

    initialize: function ()
    {
        this.model.on('getGame', function() {});
        this.model.getGame();
    }
}

因为回调在骨干网中似乎不起作用,所以必须进行触发。 因此,应用程序会侦听触发器getGame,该触发器在返回服务器的数据并保存到模型中的变量时触发。

到目前为止,这一切都很好。现在唯一的问题是我希望我的div#游戏在完成从getGame函数追加所有数据时淡出。

但我认为因为在model.on(触发器)之后,初始化函数'认为'它在运行getGame()函数之后已经准备就绪,而实际上还没有附加服务器的数据。

所以父div#all运行以下内容:

this.$el.append(new Game().el);

也“认为”div#游戏已准备好并将div#游戏附加到自身并给它一个淡入淡出。

div#game还没有包含服务器数据,所以当它确实回来时,图像和文本会很好地存在而不是fadeIn ......

有人知道如何解决这个问题吗? 提前谢谢!

=============================================== =======

解决

问题出在$ .get和$ .post函数的异步属性中。这就是在结果从服务器返回之前初始化已准备就绪的原因。我将其更改为$ .ajax并使async:false。现在它按照我编程/想要的顺序加载。

感谢您对Tallmaris的详细解释,因为我会使用很多触发器,所以它会派上用场!

1 个答案:

答案 0 :(得分:1)

您可以将div#all作为parent传递给视图,而不是让this.gameView = new Game({parent: this}); 渲染并将视图附加到自身:

Game

然后在initialize: function (options) this.parent = options.parent { this.model.on('getGame', function() { this.$el.appendTo(this.parent); }); this.model.getGame(); } 视图中

window.vent = $.extend({}, Backbone.Events);

或者你可以使用像这样的全局Backbone事件对象:

initialize: function () {
    vent.on("GameReady", function () 
      { 
        // fade in game view
      }); 
}

现在你有一个全局对象(可以根据需要命名并放入任何命名空间,不要像上面的代码那样进行),你可以像这样使用:

主要观点:

initialize: function (options)
  this.parent = options.parent
  {
      this.model.on('getGame', function() { vent.trigger("GameReady"); });
      this.model.getGame();
  }

游戏视图:

{{1}}

您还可以传递参数。阅读here for more documentation