我有一个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的详细解释,因为我会使用很多触发器,所以它会派上用场!
答案 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。