Gần đây tôi đã bắt đầu làm việc với requirejs và khi tôi cố tạo một viewmodel đơn giản, tôi nhận được một ngoại lệ lạ. Ngoại lệ xuất phát từ tệp knockout-2.1.0.js và ngoại lệ là "Chỉ những thứ có thể đăng ký mới có thể hoạt động như phụ thuộc".loại bỏ viewmodel và 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);
};
};
});
Như bạn có thể thấy chế độ xem cực kỳ đơn giản và vì lỗi nằm trong tệp loại bỏ, có vẻ như requirejs đang hoạt động bình thường. Tôi đã xem xét: http://knockoutjs.com/documentation/amd-loading.html Trường hợp ngoại lệ xảy ra khi đến dòng: self.visiblePage = ko.observable ("StartPage");
Bất kỳ ý tưởng nào về những gì tôi đang làm sai?
Cảm ơn, Ludwig
Cập nhật: Đây là mô-đun chứa 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
};
});
Và các module gọi nhà máy
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
};
});
Và lớp chứa 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
};
})
Bạn cũng có thể đăng mã nơi bạn sử dụng 'PageViewModel' và cũng có thể là mã xem của bạn không? – nemesv
theo mã nguồn ko, trong dòng 956, ngoại lệ đó xảy ra khi thuộc tính không phải là subscriable. – Ray
Thuộc tính phải được đăng ký vì nó chỉ là biến thông thường mà tôi cho là ... – user1842278