2011-07-13 79 views
2

我正在編寫一個預約應用程序。 預訂程序相當複雜,並且具有相當多的依賴性,所以我決定使用knockout來幫助我觀察更改並更新UI。Knockout JS - viewModel訪問

我開始實施客戶名單。表單中的第一位顧客將是必須輸入他的詳細信息的人,其他人只需要姓名。 我想我可以只添加一個dependentObservable來檢查當前客戶是否是customers數組中的第一個,以決定是否顯示其他字段。

問題是,當試圖從客戶訪問viewModel時,我只得到'undefined'。 我試過把viewModel的引用傳遞給客戶,但那也沒有效果。 我在做什麼錯?可以viewModel不被訪問?

下面的代碼:

var customer = function(){ 
    this.firstName = ko.observable(''); 
    this.lastName = ko.observable(''); 
    this.fullName = ko.dependentObservable(
     function(){ 
      return this.firstName() + " " + this.lastName(); 
     }, 
     this 
    ); 
    this.gender = ko.observable(''); 
    this.diet = ko.observable(''); 
    this.primaryCustomer = ko.dependentObservable(
     function(){ 
      console.log(viewModel); 
      return viewModel.customers.indexOf(this) == 0; 
     }, 
     this 
    ); 
    this.email = ko.observable(''); 
} 

var viewModel = { 
    customers: ko.observableArray([new customer()]), 
    addCustomer: function(){ 
     this.customers.push(new customer()); 
    }, 
    removeCustomer: function(customer){ 
     this.customers.remove(customer); 
    } 
} 


ko.applyBindings(viewModel); 

回答

5

我想通了。 將viewModel傳遞給客戶的想法是正確的,只是執​​行很糟糕。當我初始化客戶時,我是與一位新客戶合作的,這個客戶反過來尋找那些尚未到的客戶。

這裏的工作代碼:

var customer = function(viewModel){ 
    this.firstName = ko.observable(''); 
    this.lastName = ko.observable(''); 
    this.fullName = ko.dependentObservable(
     function(){ 
      return this.firstName() + " " + this.lastName(); 
     }, 
     this 
    ); 
    this.gender = ko.observable(''); 
    this.diet = ko.observable(''); 
    this.primaryCustomer = ko.dependentObservable(
     function(){ 
      console.log(viewModel); 
      return viewModel.customers.indexOf(this) == 0; 
     }, 
     this 
    ); 
    this.email = ko.observable(''); 
} 

var viewModel = { 
    customers: ko.observableArray(), 
    removeCustomer: function(customer){ 
     this.customers.remove(customer); 
    } 
} 
viewModel.customers.push(new customer(viewModel)); 
viewModel.addCustomer = function(){ 
     viewModel.customers.push(new customer(viewModel)); 
} 

ko.applyBindings(viewModel);