观察者模式问题 – JavaScript对象从父数组中删除自身?
作者:互联网
我正在尝试编写一个遵循观察者模式的对象关系,其中观察者关心主体上发生的一组特定事件.
我不确定这是否是100%标准,但是我构建它的方式,这些事件对象是在观察者中定义的,具有在事件发生时将触发的自定义回调.当一个事件发生在主题上时,它会通过它的所有观察者,并查看谁正在观看此事件.如果它发现观察者正在观察此事件,则会触发观察者事件的回调.
由于我希望我的观察者能够灵活地添加和删除需要关注的事件,我需要让事件对象能够在运行它的回调后删除它自己…例如,如果我的观察者只想回复一次事件,然后不再监视它.
这似乎是一个很好的计划,但我知道JavaScript对象本身不能调用delete().
我只是很好奇,是否有其他人遇到过这个,并提出了一个有效的解决方案.
我唯一的想法是我可以将引用传递给父观察者对象,它的子事件,然后当回调发生时,我可以在父内部调用一个方法…类似于removeEvent(this)将事件本身传递给它功能.然后,removeEvent函数可以从它的事件数组中拼出事件.唯一复杂的问题是在数组中找到此事件对象的位置. (也对此提出建议,谢谢!).
在此先感谢您的帮助!
解决方法:
我以为我会回答你的问题,但我不是100%确定你是如何实现你的观察者模式的.也许在我的下面的代码段中有一些有用的东西.我假设观察是通过回调函数完成的,我没有假设该数据的格式,所以我使用的是字符串.
我的解决方案的关键是回调接收对Subject的引用(这在观察者模式中是常见的).此引用可用于从主题中分离回调.
var Subject = {
observers: {},
attach: function( eventType, fn ) {
if( !this.observers[eventType] ) this.observers[eventType] = [];
this.observers[eventType].push( fn );
},
detach: function( fn ) {
var newObservers,
eventType,
i;
for( eventType in this.observers ) {
newObservers = [];
for( i = 0; i < this.observers[eventType].length; i++ ) {
if( this.observers[eventType][i] !== fn ) newObservers.push( this.observers[eventType][i] );
}
this.observers[eventType] = newObservers;
}
},
notify: function( eventType, data ) {
var i, observers = this.observers[eventType].slice(0);
for( i = 0; i < observers.length; i++ ) {
observers[i]( data, this );
}
},
poke: function() {
this.notify( 'testing', 'I got poked' );
}
};
var Observer = {
logEvent: function( data, subject ) {
console.log( 'Every time: ' + data );
},
logEventOnce: function( data, subject ) {
console.log( 'Just once: ' + data );
/*
* THE CRUX
*/
subject.detach( arguments.callee );
}
};
Subject.attach( 'testing', Observer.logEvent );
Subject.attach( 'testing', Observer.logEventOnce );
Subject.poke();
//Every time: I got poked
//Just once: I got poked
Subject.poke();
//Every time: I got poked
Subject.poke();
//Every time: I got poked
Subject.poke();
//Every time: I got poked
标签:javascript,object,arrays,parent,observer-pattern 来源: https://codeday.me/bug/20190531/1188265.html