2012-11-21 39 views
5

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

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

+0

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

+0

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

Trả lời

1

Sự cố của bạn có thể do Knockout 2.1 gây ra, không hoạt động tốt khi ko phải là biến toàn cầu.

Knockout 2.2 sẽ hoạt động tốt và tôi thấy từ nhận xét của bạn điều này đã thực sự khắc phục được sự cố.

Các vấn đề liên quan