我有一个静态类,其中包含一个回调函数数组,然后我有一些其他类用于与这个静态类进行交互......
以下是静态类的简单示例:
var SomeStaticInstance = {};
(function(staticInstance) {
var callbacks = {};
staticInstance.addCallback = function(callback) { callbacks.push(callback); }
staticInstance.callAllCallbacks = function() { /* call them all */ }
}(SomeStaticInstance));
然后这是我与其交互的其他类的一个例子:
function SomeClassOne() {
this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someCallback); }
this.someCallback = function() { /* Do something */ }
this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}
function SomeClassTwo() {
this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someOtherCallback); }
this.someOtherCallback = function() { /* Do something else */ }
this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}
现在我遇到的问题是当我调用任一类并告诉它activateCallbacks()时,类只激活它们自己范围内的回调,即SomeClassOne会调用someCallback()而不是someOtherCallback(),反之亦然,现在我假设它与闭包的范围有关,但我不知道如何得到我追求的行为......
我尝试将静态类转换为常规类,然后通过构造函数将其传递到2个类中,但仍然遇到同样的问题......
所以我的问题是如何让类来提升所有回调
- 编辑 -
这是一个显示我在实际应用程序上遇到的问题的示例,我已将所有脚本代码放入页面中以提供更清晰的示例:
http://www.grofit.co.uk/other/pubsub-test.html
这是一个简单的应用程序,有2个演示者和2个视图...一个视图关注在页面顶部添加2个数字,第二个视图关注的是获取总数并将其相乘并显示结果。< / p>
我正在使用的第三方库是PubSubJS,第一个演示者会监听一个事件,告诉它其中一个框已更改并重新排列第一行。第二个演示者在顶部的乘法或总数发生变化时进行侦听,然后重新计算底部变量。现在第一个演示者正确地重新计算,并且第二个演示者将在乘法框改变时正确地重新计算,但是!当顶部的总数发生变化时,它会 NOT 重新计算,甚至认为它应该收到通知...
无论如何,请快速查看页面上的源代码,看看我的意思......
答案 0 :(得分:1)
首先,我认为你需要var callbacks = [](一个数组而不是一个对象)因为你正在使用callbacks.push()。
我不确定我理解你的问题。您的类的结构方式,您可以通过实例化这两个类并在两个新对象上调用addCallbackToStaticInstance()来实现您想要的。如,
var one = new SomeClassOne();
var two = new SomeClassTwo();
one.addCallbackToStaticInstance();
two.addCallbackToStaticInstance();
one.activateCallbacks();
然后,如上所述,您可以从任一对象调用activateCallbacks()。
如果你说在实例化其中一个类之后你想要能够调用activateCallback(),你真的必须重新考虑你的方法。我首先将addCallbackToStaticInstance()和activateCallbacks()移动到他们自己的类中。
答案 1 :(得分:0)
这是一种非常奇怪的处理方式,但是你的主要问题是你的回调对象不是SomeStaticInstance的一部分,它是在一个匿名闭包中定义的。您的回调对象{}
也应该是数组[]
。
尝试staticInstance.callbacks = [];
而不是var callbacks = {};
和
staticInstance.addCallback = function(callback) {
this.callbacks.push(callback);
}