5

最近requirejsを使い始めましたが、単純なビューモデルを作成しようとすると、奇妙な例外が発生します。例外はknockout-2.1.0.jsファイルからのものであり、例外は「サブスクライブ可能なもののみが依存関係として機能できる」です。

define("PageViewModel", ["knockout-2.1.0"], function(ko) {
    return function PageViewModel() {
        var self = this;
        self.visiblePage = ko.observable("StartPage");
        self.showPage = function (pageName) {
            self.visiblePage(pageName);
        };
    };
});

ご覧のとおり、ビューモデルは非常に単純であり、エラーはノックアウトjsファイルにあるため、requirejsは正常に機能しているようです。私はこれまで見てきました:http ://knockoutjs.com/documentation/amd-loading.html例外は次の行に来るときに発生します:self.visiblePage = ko.observable( "StartPage");

私が間違っていることについて何か考えはありますか?

ありがとう、ルートヴィヒ

更新:これは、pageviewmodelを含むモジュールです。

define("ViewModelFactory", ["StorageService", "PageViewModel", "AddUnitViewModel", "AddRoomViewModel"],
function (StorageService, PageViewModel, AddUnitViewModel, AddRoomViewModel) {
    //var repositoryStorage = new StorageService();
    var createAddRoomVM = function () {
        var vm = new AddRoomViewModel();
        vm.setRepository = StorageService.getRoomRepository();
        return vm;
    };
    var createAddUnitVM = function () {
        var vm = new AddUnitViewModel();
        vm.setRepository = StorageService.getUnitRepository();
        return vm;
    };
    var createPageVM = function () {
        var vm = new PageViewModel();
        return vm;
    };

    return {
        createPageVM:createPageVM,
        createAddRoomVM: createAddRoomVM,
        createAddUnitVM: createAddUnitVM
    };
});

そして、ファクトリを呼び出すモジュール

define("ApplicationViewModel", ["ViewModelFactory"],
function (viewModelFactory) {
    mainVM = null;
    var initVM = function () {
        mainVM = {
            page: viewModelFactory.createPageVM(),
            addRoom: viewModelFactory.createAddRoomVM(),
            addUnit: viewModelFactory.createAddUnitVM()
        };
    };

    var getVM = function (viewName) {
        switch (viewName) {
            case "AddRoom":
                return mainVM.addRoom;
            case "AddUnit":
                return mainVM.addUnit;
            default:
                return null;
        }
    };
    var getPageVM = function () {
        return mainVM.page;
    };

    return {
        initVM: initVM,
        getVM: getVM,
        getPageVM: getPageVM,
        mainVM: mainVM
    };
});

そして、applicationViewModelを含むクラス:

define("Bootstrapper", ["knockout-2.1.0", "Routing", "ApplicationViewModel"],
function (ko, routing, applicationViewModel) {
    var run = function () {
        applicationViewModel.initVM(); <-- after here mainVM.page is null
        var mainVM = applicationViewModel.mainVM;
        routing.initRouting(applicationViewModel);
        ko.applyBindings(mainVM);
        routing.showView("StartPage");
        alert("Start");
    };

    return {
        run: run
    };
})
4

1 に答える 1

1

この問題は、ko がグローバル変数でない場合にうまく機能しなかった Knockout 2.1 が原因である可能性があります。

Knockout 2.2 は正常に動作するはずです。あなたのコメントから、これで実際に問題が解決したことがわかります。

于 2012-12-03T20:32:19.763 に答える