gpt4 book ai didi

javascript - aurelia property observer 未被处置

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:19 25 4
gpt4 key购买 nike

各位,

我有一个 ViewModel,它将一个单例注入(inject)到它的构造函数中。然后,在构造函数中,我在单例实例的属性上创建了一个观察者。

在 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 时,它会对已创建的所有页面实例进行更改。即我导航到/离开该页面的次数。

通过记录调试语句,这一切都非常明显。

observer.dispose() 不应该移除观察者吗?我的 ViewModel 实例不应该也被处置吗?

谢谢

唐纳尔

最佳答案

Observer 应该在你的代码中被释放,正如你从这个例子中看到的那样 https://codesandbox.io/s/ovvp7m05o5

  • 登陆时,点击文档任意位置会增加counter + log Click changed called
  • 当导航到第 2 页时,点击任意位置会增加计数器 + 不记录 Click changed called

我认为您不小心覆盖了类(class)中的观察者引用。在构造函数中创建一次的观察者永远不会被再次引用以正确处理。

关于javascript - aurelia property observer 未被处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com