我正在编写一个帆布赛车游戏,并计划使用事件来确定每个游戏对象何时初始化并准备使用。首先,我尝试向我的对象添加事件侦听器,但意识到它们只能附加到html元素。作为一种解决方法,我改为向窗口对象添加了一个监听器。
我很感激建议我是否应该根据这个问题使用事件,如果有任何常见的模式/方法我应该看一下?我打算阅读Observer模式,这看起来是否适合这种情况?
下面的代码片段显示了我目前正在做的事情。当加载Track对象的所有项时,它将调度一个由附加到窗口对象的事件侦听器捕获的事件。
主:
function game() {
var loadCount = 0;
var itemsToLoad = 10;
window.addEventListener("finishedLoading", itemLoaded, false);
function itemLoaded(event) {
loadCount++;
if(loadCount >= itemsToLoad)
{
gameStateFunction = title;
}
}
}
跟踪对象:
function Track(name, bgTileSheet) {
this.backgroundImage = new Image();
this.itemsLoaded = 0;
this.itemsToLoad = 3;
this.loadedEvent = new CustomEvent("finishedLoading", {
detail: {
objectType: "track"
},
bubbles: true,
cancelable: false
});
this.centerPath = null;
}
Track.prototype.updateLoadProgress = function() {
this.itemsLoaded++;
if(this.itemsLoaded >= this.itemsToLoad)
{
dispatchEvent(this.loadedEvent);
}
};
Track.prototype.init = function() {
//calls loadItems() when XML data is ready
};
Track.prototype.loadItems = function() {
this.loadBackground();
this.loadMapDimensions();
this.loadPaths();
};
Track.prototype.loadBackground = function() {
var self = this;
this.backgroundImage.addEventListener("load",
function() {
self.updateLoadProgress();
},
false);
this.backgroundImage.src = Track.TILESHEET_DIR + this.bgTileSheet;
};
答案 0 :(得分:0)
是的,我会说事件就是这样的事情。只是你必须放松对事件的定义,使其不能单独附加到HTML元素上。
你最终用于此类事情的大多数模式 - 观察者,订阅者,调解者,等等 - 都会在另一种意义上使用一种人为的事件形式。
您可能想要研究的一件事是jQuery的延迟对象。这些通常与AJAX相关,但也可以非常有效的方式与人为的主观事件一起使用。
几个月前,我在这上面写了a blog post,为此展示了一种技术。
以下是一个快速示例:
function SomeClass() {
this.ready = false;
this.deferred = $.Deferred();
}
SomeClass.prototype.makeReady = function() {
this.ready = true;
this.deferred.resolve();
}
var myInstance = new SomeClass();
//listen for ready
$.when(myInstance.deferred).done(function() { alert('object is ready!'); });
//after a while, let's say we're ready
setTimeout(function() { myInstance.makeReady(); }, 2000);
这里的超时只是模拟您设置对象的真实环境 - 执行AJAX请求,其他代码,等等。
最后,虽然您确实无法直接将事件附加到对象,但您可以通过getters/setters将对象附加到对象属性。