0

我有一个包含回调函数数组的静态类,然后我有一些其他类用于与这个静态类交互......

这是静态类的一个简单示例:

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 个数字,第二个视图涉及获取总数并将其相乘并显示结果。

我使用的第 3 方库是PubSubJS,第一个演示者侦听一个事件,告诉它其中一个框已更改并重新汇总第一行。当顶部的乘法或总计发生变化时,第二个演示者会监听,然后重新计算底部的值。现在第一个演示者重新计算正确,而第二个演示者将在乘法框发生变化时正确重新计算,但是!当顶部的总数发生变化时,它不会重新计算,即使它应该收到通知......

无论如何,快速浏览一下页面上的源代码,看看我的意思......

4

2 回答 2

1

首先,我认为您需要 var callbacks = [] (一个数组而不是一个对象),因为您使用的是 callbacks.push()。

我不确定我是否理解你的问题。你的类的结构方式,你可以通过实例化两个类并在两个新对象上调用 addCallbackToStaticInstance() 来实现你想要的。例如,

var one = new SomeClassOne();
var two = new SomeClassTwo();
one.addCallbackToStaticInstance();
two.addCallbackToStaticInstance();
one.activateCallbacks();

然后,如上所述,您可以从任一对象调用 activateCallbacks()。

如果您说您希望能够在仅实例化一个类之后调用 activateCallback(),那么您真的必须重新考虑您的方法。我首先将 addCallbackToStaticInstance() 和 activateCallbacks() 移动到他们自己的类中。

于 2011-04-30T10:55:24.050 回答
0

这是一种非常奇怪的做事方式,但您的主要问题是您的回调对象不是 SomeStaticInstance 的一部分,它是在匿名闭包中定义的。此外,您的回调对象{}应该是一个数组[]

尝试staticInstance.callbacks = [];代替var callbacks = {};

staticInstance.addCallback = function(callback) { 
  this.callbacks.push(callback); 
}
于 2011-04-30T10:32:49.747 回答