наблюдатель за имуществом аурелии не располагает - PullRequest
2 голосов
/ 16 марта 2019

Люди,

У меня есть ViewModel, которая вставляет синглтон в его конструктор. Затем в конструкторе я создаю наблюдателя для свойства в экземпляре синглтона.

В функции detached () я располагаю подпиской обозревателя.

constructor( singleton: MySingleton, bindingEngine: BindingEngine )
{
    this.observer = bindingEngine
        .propertyObserver( singleton, 'state' )
        .subscribe( ( newValue, oldValue ) => this.onStateChanged( newValue, oldValue ) ) ;

}

// Sample updated with offending code    
detatched()
{
    // was calling it incorrectly like this - thought TypeScript would have flagged the problem
    // this.observer.dispose ;

    // and it should have been like this
    this.observer.dispose() ;
    // and setting observer to undefined is probably the safest
    this.observer = undefined ;
}

Что происходит, так это то, что каждый раз, когда я перехожу на страницу, создается новый экземпляр ViewModel, и когда я покидаю страницу, вызывается detatched. (что я ожидаю, что произойдет).

Однако наблюдатель не удаляется / не удаляется, и экземпляр ViewModel остается в памяти. Когда значение 'state' изменяется и вызывается onStateChanged, это происходит для всех созданных экземпляров страницы. то есть, сколько раз я переходил на страницу или от нее.

Все это очень очевидно, когда в журнал записываются операторы отладки.

Должен ли Obsever.dispose () не удалять наблюдателя? Разве мой экземпляр ViewModel также нельзя утилизировать?

Спасибо

Донал

1 Ответ

0 голосов
/ 17 марта 2019

Обозреватель должен просто располагаться в вашем коде, как вы можете видеть из этого примера https://codesandbox.io/s/ovvp7m05o5

  • При приземлении щелчок в любом месте документа увеличивает счетчик + журнал Click changed called
  • При переходе на страницу 2 нажатие в любом месте увеличивает счетчик + не регистрируется Click changed called

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

...