Закрытие Javascript и проблема * статических * классов - PullRequest
0 голосов
/ 30 апреля 2011

У меня есть статический класс, который содержит массив функций обратного вызова, затем у меня есть несколько других классов, которые используются для взаимодействия с этим статическим классом ...

Вот простой пример статического класса:

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(); }
}

Теперь проблема, с которой я столкнулся, заключается в том, что когда я вызываю любой из классов и говорю ему, чтобы ActivCallbacks () классы активируют только обратные вызовы в своей области видимости, то есть SomeClassOne будет вызывать someCallback (), но не someOtherCallback (), и наоборот, теперь Я предполагаю, что это как-то связано с объемом замыканий, однако я не уверен, как получить поведение, за которым я следую ...

Я пытался превратить статический класс в обычный класс, а затем передать его в 2 класса с помощью конструктора, но все еще получаю ту же проблему ...

Итак, мой вопрос: как заставить классы вызывать все обратные вызовы

- РЕДАКТИРОВАТЬ -

Вот пример, отображающий ту же проблему, что и мое настоящее приложение. Я поместил весь код скрипта на страницу, чтобы дать более ясный пример:

http://www.grofit.co.uk/other/pubsub-test.html

Это простое приложение с 2 докладчиками и 2 представлениями ... одно представление связано с добавлением 2 чисел в верхней части страницы, второе представление - с получением этой суммы, ее умножением и отображением результата.

Используемая мной сторонняя библиотека PubSubJS , и первый докладчик прослушивает событие, чтобы сообщить ему, что один из блоков изменился, и пересчитывает верхнюю строку. 2-й докладчик слушает, когда меняется умножение или итог в верхней части, а затем пересчитывает нижнюю. Теперь первый докладчик правильно пересчитывает, а второй докладчик будет правильно пересчитывать всякий раз, когда изменяется окно умножения, ОДНАКО! Он будет НЕ пересчитывать, когда сумма на вершине изменяется, даже если он должен получить уведомление ...

В любом случае, быстро просмотрите исходный код на странице, чтобы понять, что я имею в виду ...

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Во-первых, я думаю, что вы хотите, чтобы var callbacks = [] (массив вместо объекта), поскольку вы используете callbacks.push ().

Я не уверен, что понимаю вашу проблему.То, как ваши классы структурированы, вы можете достичь того, что хотите, создавая экземпляры обоих классов и вызывая addCallbackToStaticInstance () для обоих новых объектов.Например,

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

Затем, как указано выше, вы можете вызывать activCallbacks () из любого объекта.

Если вы говорите, что хотите иметь возможность вызывать activCallback () только после создания экземпляраодин из классов, вы действительно должны переосмыслить свой подход.Я бы начал с перемещения addCallbackToStaticInstance () и activCallbacks () в их собственный класс.

0 голосов
/ 30 апреля 2011

Это очень странный способ работы, но ваша главная проблема в том, что ваши обратные вызовы возражают, что он не является частью SomeStaticInstance, он определен в анонимном закрытии. Также ваш объект обратных вызовов {} должен быть массивом [].

попробуйте staticInstance.callbacks = []; вместо var callbacks = {};

и

staticInstance.addCallback = function(callback) { 
  this.callbacks.push(callback); 
}
...