Knockout 组件资源清理和内存管理

资源清理和内存管理

可选择地,你的viewmodel类可以有一个dispose函数,假如实现,Knockout将调用这个函数,无论什么时候该组件被销毁(例如,因为响应的项被从foreach中除去,或者if绑定变成false)

你必须使用dispose 来除去任何不是被内在的垃圾可收集的资源。例如:

  • setInterval回调将继续触发直到被清楚地清除

    • 使用clearInterval(handle)去停止它们,否则你的视图模型可能会驻留内存
  • ko.computed属性继续从它们的依赖对象接收通知直到北清楚地销毁
    • 假如一个依赖是关于一个外部对象,那么确信使用computed的属性.dispose(),否则它(也可能是你的视图模型)将驻留内存,可选地,考虑使用pure computed来避免手工清理的需要
  • 订阅observable继续触发直到被清楚地销毁
    • 假如你订阅了一个外部observable,确信使用subscription的.dispose(),否则该回调(也可能是你的视图模型)将驻留内存)
  • 在外部DOM元素手工创建事件句柄,假如在一个createViewModel函数内创建(或甚至在一个正常的组件视图模型内,虽然MVVM模式不适合你?)必须被除去
    • 当然,你不必担心释放在你的视图中使用标准Knockout绑定创建的事件句柄,因为当元素被除去时KO自动的反注册他们)

例如:

var someExternalObservable = ko.observable(123);

function SomeComponentViewModel() {
    this.myComputed = ko.computed(function() {
        return someExternalObservable() + 1;
    }, this);

    this.myPureComputed = ko.pureComputed(function() {
        return someExternalObservable() + 2;
    }, this);

    this.mySubscription = someExternalObservable.subscribe(function(val) {
        console.log('The external observable changed to ' + val);
    }, this);

    this.myIntervalHandle = window.setInterval(function() {
        console.log('Another second passed, and the component is still alive.');
    }, 1000);
}

SomeComponentViewModel.prototype.dispose = function() {
    this.myComputed.dispose();
    this.mySubscription.dispose();
    window.clearInterval(this.myIntervalHandle);
    // this.myPureComputed doesn't need to be manually disposed.
}

ko.components.register('your-component-name', {
    viewModel: SomeComponentViewModel,
    template: 'some template'
});

仅仅依赖同一视图模型对象的computed和subscription不是严格需要销毁的,因为这仅仅创建了一个Javascript垃圾收集器知道如何释放的循环参考。然而,为了避免必须记得哪些东西需要清理,只要有可能,你最好使用pureComputed,不管是不是在技术尚必要,都显式地销毁所有其他computeds/subscriptions。

原文:

Disposal and memory management

Optionally, your viewmodel class may have a dispose function. If implemented, Knockout will call this whenever the component is being torn down and removed from the DOM (e.g., because the corresponding item was removed from aforeach,
or an if binding has become false).

You must use dispose to release any resources that aren’t inherently garbage-collectable. For example:

  • setInterval callbacks will continue to fire until explicitly cleared.

    • Use clearInterval(handle) to stop them, otherwise your viewmodel might be held in memory.
  • ko.computed properties continue to receive notifications from their dependencies until explicitly disposed.
    • If a dependency is on an external object, then be sure to use .dispose() on the computed property, otherwise it (and possibly also your viewmodel) will be held in memory. Alternatively, consider using apure
      computed
      to avoid the need for manual disposal.
  • Subscriptions to observables continue to fire until explicitly disposed.
    • If you have subscribed to an external observable, be sure to use .dispose() on the subscription, otherwise the callback (and possibly also your viewmodel) will be held in memory.
  • Manually-created event handlers on external DOM elements, if created inside acreateViewModel function (or even inside a regular component viewmodel, although to fit the MVVM pattern you shouldn’t) must be removed.
    • Of course, you don’t have to worry about releasing any event handlers created by standard Knockout bindings in your view, as KO automatically unregisters them when the elements are removed.

For example:

var
someExternalObservable = ko.observable(123);

function
SomeComponentViewModel() {

    this.myComputed = ko.computed(function() {

        returnsomeExternalObservable() + 1;

    },this);

    this.myPureComputed = ko.pureComputed(function() {

        returnsomeExternalObservable() + 2;

    },this);

    this.mySubscription = someExternalObservable.subscribe(function(val)
{

        console.log(‘The external observable changed to ‘+ val);

    },this);

    this.myIntervalHandle = window.setInterval(function() {

        console.log(‘Another second passed, and the component is still alive.‘);

    }, 1000);

}

SomeComponentViewModel.prototype.dispose =function() {

    this.myComputed.dispose();

    this.mySubscription.dispose();

    window.clearInterval(this.myIntervalHandle);

    // this.myPureComputed doesn‘t need to be manually disposed.

}

ko.components.register(‘your-component-name‘, {

    viewModel: SomeComponentViewModel,

    template: ‘some template‘

});

It isn’t strictly necessary to dispose computeds and subscriptions that only depend on properties of the same viewmodel object, since this creates only a circular reference which JavaScript garbage collectors know how to release. However, to avoid having
to remember which things need disposal, you may prefer to use pureComputed wherever possible, and explicitly dispose all other computeds/subscriptions whether technically necessary or not.

时间: 2024-11-09 17:13:59

Knockout 组件资源清理和内存管理的相关文章

【R笔记】R的内存管理和垃圾清理

R输入命令时速度不要太快,终究是个统计软件,不是编程! 写R程序的人,相信都会遇到过“cannot allocate vector of size”或者“无法分配大小为...的矢量”这样的错误.原因很简单,基本都是产生一个大矩阵等对象时发生的,最干脆的解决办法有两种,第一种是加大内存换64位系统,第二种是改变算法避免如此大的对象.第一种办法,是最好的办法,不过大对象的需求是没有止尽的,终究不是长久之道.第二种办法是最好的思路,无论多么大的对象都是可以弄小的,无非就是分而治之.时间换空间等,对算法

Android内存管理分析

大部分因为工作任务繁重,一般我们很少关心内存的事,只知道先把任务完成.只有真正到了发现UI卡顿 或者APP实在跑不下去了(一点一卡),才会考虑到内存优化.或者你所在的大公司比较关心手机运行流利程度,也需要对内存进行管理. 1.内存管理的基础知识 因为安卓的顶层也是 Java来实现的,作为客户顿的程序员应该懂得如何去管理内存. 又因为Java不像C语言可以执行free去主动释放内存,而是提供了一套Java的垃圾处理器.但是该处理器并不能时刻盯着内存,在内存不需要的时候直接清理(程序员比较方便,但是

Android官方开发文档Training系列课程中文版:APP的内存管理

原文地址:http://android.xsoftlab.net/training/articles/memory.html 随机存储器(RAM)在任何运行环境中都是一块非常重要的区域,尤其是在内存受限的移动操作系统上.尽管Android的Dalvik虚拟机会对其进行垃圾回收,但是这不意味着APP就可以忽略申请及释放的内存. 为了可以使垃圾回收器能够有效清理APP所占用的内存空间,你需要防止内存泄漏发生,并需要在适当的时间将Reference对象释放.对大多数APP来说,垃圾回收器会在正确的对象

effective OC2.0 52阅读笔记(五 内存管理)

第五章:内存管理 29 理解引用计数 30 以ARC简化引用计数 总结:ARC通过命名约定将内存管理规则标准化.其他编程语言很少像OC这样强调命名.ARC通过设置全局数据结构(此数据结构的具体内容因处理器而异)中的一个标志位,来代替直接调用autorelease和retain.这是ARC所带来的好处.待编译器与运行期组件日臻成熟,还会出现其他的优化技术.CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease. 31 在dealloc方法中只释放引用

Android中的内存管理机制以及正确的使用方式

概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操作系统的内存管理机制. 第一:分配机制.为每一个进程分配一个合理的内存大小,保证每一个进程能够正常的运行,不至于内存不够使用或者每个进程占用太多的内存. 第二:回收机制.在系统内存不足打的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行.回收的时候就要杀死那些正在占有内存的进程,操

Android内存管理、优化

RAM对于软件开发环境而言是有价值的资源,但它对受限于物理内存限制的操作系统具有更大的价值.即使Android Runtime和Dalvik virtual machein执行常规的垃圾回收,但这并不意味着你可以忽略app在何时何地指派和释放内存.你仍然需要去避免产生内存泄露.比如长期持有静态成员变量常常引起内存泄露,你应该在合适的时间,比如在生命周期回调函数处释放一些引用对象,来避免内存泄露的发生. 这篇文章将阐述怎样在app中主动的降低内存消耗.关于java编程中清理资源的一般实践,请参照其

JMM内存管理

原文地址http://www.cnblogs.com/BangQ/p/4045954.html 原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多.一个开发Java的开发者,一旦了解了JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知:[email protected],本文尽

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

JVM内存管理

物理内存和虚拟内存 (1)在java中,分配内存和回收内存都由JVM自动完成,甚至不需要写和内存相关的代码(2)物理内存即RAM还有寄存器(一种存储单元,用于存储计算机单元执行指令(如整形浮点等运算)的中间结果)是处理器通过地址总线连接的.地址总线:其宽度决定了一次可以存寄存器或者RAM中获取多少个bit和处理器最大的可以寻址的范围,每个地址会引用一个字节,所以如果是32位的总线则可以有4G的内存空间.(通常情况下地址总线和RAM或寄存器有相同的位数)(3)通常操作系统的内存申请空间是按照进程来