Knockout依赖项的处理函数

时间:2014-07-15 16:06:50

标签: javascript memory-management knockout.js

我有一个实用程序来扩充一个对象来表达当前的ajax状态,如下所示:

define(['ko'], function (ko) {
    var ajaxStatus = {
        success: 2,
        failure: -1,
        working: 1,
        none: 0,
    };

    return {
        ajaxStatusHelper: init,
    };


    function init(target) {
        if (target == undefined) throw new Error("Target cannot be undefined.");

        target.ajaxStatus = ko.observable(ajaxStatus.none);
        target.indicateSuccess = success.bind(target);
        target.indicateWorking = working.bind(target);
        target.indicateFailure = failure.bind(target);
        target.clearStatus = clear.bind(target);

        // computed properties
        target.ajaxSuccess = ko.computed(function () {
            return this.ajaxStatus() === ajaxStatus.success;
        }, target);
        target.ajaxFailure = ko.computed(function () {
            return this.ajaxStatus() === ajaxStatus.failure;
        }, target);
        target.ajaxWorking = ko.computed(function () {
            return this.ajaxStatus() === ajaxStatus.working;
        }, target);
        target.ajaxInactive = ko.computed(function () {
            return this.ajaxStatus() === ajaxStatus.none;
        }, target);

        return target;
    }

    // functions
    function clear() {
        this.ajaxStatus(ajaxStatus.none);
    }
    function success() {
        this.ajaxStatus(ajaxStatus.success);
    }
    function working() {
        this.ajaxStatus(ajaxStatus.working);
    }
    function failure() {
        this.ajaxStatus(ajaxStatus.failure);
    }
});

此实用程序可用于扩展同一视图模型对象中的多个对象。例如,我通常会扩展执行异步ajax调用的命令成员,以便视图可以在图标中显示,指示调用命令的结果(此处未显示KO绑定)。

我的问题是我有什么责任来清理这些增强节点以及管理此清理的机制。

According to Michael Best

  

一旦所有对它及其依赖项的引用都被删除,JavaScript垃圾收集器只能处理一个计算的observable。

这是否意味着我需要在处理模型时从视图模型中手动处理这些增强成员?或者,当删除关联的UI元素时,Knockout会自动删除所有成员吗?

P.S。如果它有所作为,我现在正在使用Knockout 2.3.0,但我正在努力迁移到3。?

0 个答案:

没有答案