2012-11-27 76 views
0

我有一個包含多個可觀察對象(預算,公司,成本中心)數組的視圖模型。 預算有一個CostcenterID和一個可計算的可觀察性,該成本中心根據costcenterid從costcenterlist返回該預算的成本中心。成本中心有一個companyID和一個計算的observable,可以從基於commpanyId的公司列表中返回該成本中心的公司。處理嵌套可觀察對象中的空對象

在我看來,i'n結合的預算和,我有

<td> 
    <select data-bind="options:$root.Costcenter,optionsCaption:'cost center', optionsText:'Title', optionsValue:'Id', value:CostCenterId "></select>       
</td> 
<td> 
    <span data-bind="text:CostCenter().Company().Title"></span> 
</td> 

它工作正常,如果預算有costcenter,但是當costcenter不存在一個給定的預算,我收到了綁定錯誤

0x800a139e - Microsoft JScript runtime error: Unable to parse bindings.

Message: TypeError: Object doesn't support this property or method;

Bindings value: text:CostCenter().Company().Title

(我計算的costCenter的observable會返回一個空Object {},如果它沒有根據costcenterID找到costcenter)。

最好的辦法是處理這個問題,而不是用一堆檢查對象是否爲空的if語句來亂拋我的綁定?

回答

1

我建議你包裹起來用div的,costCenter(或相同TD)例如相關的任何功能,將檢查,如果該對象是未定義或不: 像

costCenterAccessible = ko.computed(
function() 
{ 
    return self.CostCenter() != undefined; 
}, this 
); 


<td data-bind="visible: costCenterAccessible> 
    <span data-bind="text:CostCenter().Company().Title"></span> 
</td> 

但如果不是所有的字段都可以訪問,你需要三思而後行,這個任務的使用是一個很好的解決方案。

6

一個簡單的解決方案是使用with綁定來包裝您的Title範圍並且CostCenter只在空時返回null。

<td data-bind="with: CostCenter"> 
    <span data-bind="text: Company().Title"></span> 
</td> 

CostCenter爲空,也不會呈現內的內容,也不會嘗試綁定對性能/不存在的觀測。

或者,您可以創建一個計算的可觀察值,它特別代表Title,如:<span data-bind="text: CostCenterCompanyTitle"></span>。因此,在這種情況下計算將處理檢查以查看CostCenter是否已定義。如果你有很多屬性需要綁定,這可能會讓你的視圖模型複雜化和混亂。使用with綁定是一個更容易的選擇。

0

<td> <div data-bind="if: CostCenter()"> <span data-bind="text:CostCenter().Company().Title"></span> </div> </td>

這要打印的標題之前檢查CostCenter。

相關問題