2017-01-30 92 views
-1

我是Knockout的新手,並且仍在嘗試瞭解它是如何工作的。我有這個函數應該從ajax調用返回數據,但是當我嘗試獲取值時,對象說它是未定義的。Knockout JS:對象總是返回undefined,即使應該有值

我的模型,其數據是不確定的:

function ViewModel() { 
    var self = this; 
    self.Organization = ko.observable(); 
    self.App = ko.observableArray([]); 
    self.Deployed = ko.observableArray([]); 
    self.EngagementSolutions = ko.observableArray([]); 
    self.MS = ko.observable(); 


    self.ActiveEngagements = ko.computed(function() { 
     var ActiveEngagements = 0; 
     ko.utils.arrayForEach(self.EngagementSolutions(), function (item) { 
      if (item.IsActive) { 
       ActiveEngagements++; 
      } 
     }); 
     return ActiveEngagements; 
    }); 
    self.TicketCount = ko.computed(function() { 
     console.log(self.Organization.UniqueICount); 
     var uniqueOpenICount = (self.Organization.UniqueOpenICount === "undefined" ? self.Organization.UniqueOpenICount : 0); 
     var uniqueICount = (self.Organization.UniqueICount === "undefined" ? self.Organization.UniqueICount : 0); 
     console.log(uniqueOpenICount + "/" + uniqueICount); 
     return uniqueOpenICount + "/" + uniqueICount; 
    }); 

我的函數,這些函數值填充對象:

function SucessFunction(data) { 
    console.log(data.Organizations[0].UniqueICount); 

     var newOrganization = new OrganizationObject(); 
     newOrganization.UniqueICount = data.Organizations[0].UniqueICount; 
     newOrganization.UniqueOpenICount = data.Organizations[0].UniqueOpenICount; 

     console.log(newOrganization); 
     viewModel.Organization = newOrganization; 
     console.log(viewModel.Organization); 
    } 
}); 

預先感謝您的幫助

+0

我建議通過一些KO教程使用的網站和其他地方,基於代碼,您目前還沒有獲得一些基本知識。 –

回答

0

你錯誤地使用observable。 KO的觀測值爲函數

您可以通過用一個新值作爲參數調用他們設置自己的價值:

viewModel.Organization(newOrganization); 

viewModel.Organization = newOrganization; // Not this 

通過調用他們沒有參數的獲取自己的價值:

console.log(viewModel.Organization()); 
// -------------------------------^^ 

不是

console.log(viewModel.Organization);  // Not this 

主要是,你濫用它的方式將導致計算不能正常工作,並且視圖不能更新。

還有一些其他的問題:

  • 當你開始正確地使用可觀察到的,你還需要更新計算機的代碼不僅正確地得到它的價值,但以允許事實上,它始於undefined,這意味着您無法從中讀取這些從屬屬性。
  • 您正在比較屬性值與"undefined"。我猜你可能是想比較他們的類型"undefined"或比較它們的值與undefined。但是將它們的值與"undefined"比較會給你false,除非它們實際上包含字符串"undefined"
  • 還有一些花括號和括號不匹配,至少在問題的代碼中。

這裏有一個粗略的更新,但它並不意味着完成所有的工作,只爲你指出正確的方向:

function ViewModel() { 
    var self = this; 
    self.Organization = ko.observable(); 

    self.TicketCount = ko.computed(function() { 
     // *** Reading the value, using a local variable to remember it during this call, 
     // branching if we don't have one y et 
     var organization = self.Organization(); 
     if (!organization) { 
      // We don't have one yet 
      return "-/-"; 
     } 
     console.log(organization.UniqueICount); 
     // *** Handling undefined by values via || 
     var uniqueOpenICount = organization.UniqueOpenICount || 0; 
     var uniqueICount = organization.UniqueICount || 0; 
     console.log(uniqueOpenICount + "/" + uniqueICount); // *** Beware that 0/0 is NaN, and n/0 is Infinity, so 
     return uniqueOpenICount + "/" + uniqueICount;  // *** ...you probably want more logic here 
    }); 
} 

function SucessFunction(data) { 
    console.log(data.Organizations[0].UniqueICount); 

    var newOrganization = new OrganizationObject(); 
    newOrganization.UniqueICount = data.Organizations[0].UniqueICount; 
    newOrganization.UniqueOpenICount = data.Organizations[0].UniqueOpenICount; 

    console.log(newOrganization); 
    // *** Note setting it via call 
    viewModel.Organization(newOrganization); 
    // *** Note getting it via call 
    console.log(viewModel.Organization()); 
} 
+0

對不起,我應該加入這個問題,這不是通過這個函數獲得的唯一數據。當我使用'viewModel.Organization(newOrganization);'它覆蓋這個函數中需要的其他數據在工作 – WorkHardWork

+1

@WorkHardWork:儘管基本問題沒有改變:你正在使用'observable'不正確。細節是一個調試問題。 –