Замыкания Javascript и проблема * статических * классов

StackOverflow https://stackoverflow.com/questions/5840960

Вопрос

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

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

родовое слово

Вот пример других моих классов, которые с ним взаимодействуют:

родовое слово

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

родовое слово

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

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

Другие советы

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

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

и

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top