2012-11-21 55 views
5

我最近開始與requirejs一起工作,當我嘗試創建一個簡單的viewmodel我得到一個奇怪的例外。異常來自knockout-2.1.0.js文件,異常是「只有可訂閱的東西可以充當依賴關係」。淘汰賽viewmodel和requirejs

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 
    }; 
}) 
+0

你還可以發佈你的代碼在哪裏使用你的'PageViewModel',也許你的視圖代碼? – nemesv

+0

根據ko源代碼,在行956中,當屬性不可下標時發生異常。 – Ray

+0

該屬性應該是可訂閱的,因爲它只是一個常規變量,我想... – user1842278

回答

1

您的問題可能是由Knockout 2.1引起的,當ko不是全局變量時,它並不能正常工作。

Knockout 2.2應該可以正常工作,而且從您的評論中可以看出,這確實解決了問題。