0

シングルページアプリケーションを実装しています。

<div id="container"/>を使用して html コンテンツをロードするコンテナ div ( ) がありますAJAX

// function that is overwritten by loadMenu functions
// and gets called before loading a new section 
function unbindPreviousSection() { };

// load contacts
function loadContactsMenu() {
    unbindPreviousSection();
    unbindPreviousSection = function () { };

    $.get("/Home/Contacts", function (data, status) {
        if (status === "success") {
            $("#content").html(data);
            contactsMenu.bind();
            unbindPreviousSection = contactsMenu.unbind;
        }
    });
};

// load profile
function loadProfileMenu() {
    unbindPreviousSection();
    unbindPreviousSection = function () { };

    $.get("/Home/Profile", function (data, status) {
        if (status === "success") {
            $("#content").html(data);
            unbindPreviousSection = function() {
                // specific unbind methods for this menu
            };
        }
    });
};

var contactsMenu = {};
(function () {
    var viewModel = null;

    contactsMenu.bind = function () {
        viewModel = {
            phones: ko.observableArray()
        };
    };

    contactsMenu.addPhone = function (phone) {
        viewModel.phones.push(phone);
    };

    contactsMenu.unbind = function () {
        viewModel = null;
    };
}());

メニューロード関数内unbindで、以前にロードされたメニューのメソッドを内部的に呼び出します。

loadContactsMenu();
loadProfileMenu();  // internally calls contactsMenu.unbind();

データをロードする前に、unbindPreviousSection()関数を呼び出して前のメニュー データを破棄します。

私の質問は:

viewModelオブジェクト内の変数は、null に設定してもcontactsMenu呼び出した後も保持されますか? contactsMenu.unbind()(メモリリークが発生しますか?)

関数はメモリ変数contactsMenu.addPhoneに保存するクロージャを作成しますか(関数内で使用されるため)?viewModel

4

1 に答える 1