2015-02-10 59 views
0

我正在使用最新的KO Mapping插件。這個想法是Details部分應該填充從Ajax Call中檢索的JSON數據。敲除映射數據綁定不起作用

var supervisorVM = { 
     supervisor: ko.observable() 
    }; 

-----------code to call custom data service which returns JSON--- 
    if (supervisorDetails) { 
     $('#Detail').show(); 
     supervisorVM.supervisor = ko.mapping.fromJS(supervisorDetails); 
     ko.applyBindings(supervisorVM, document.getElementById("Detail")); 
    } 



<div id="Detail" class="side-widget" style="display:none"> 
    <h2>Details</h2> 
    <strong> 
     Supervisor<br> 
     <span data-bind="text: supervisor.FullName"></span><br/> 
    </strong> 
    <span data-bind="text: supervisor.PhoneNumber"></span><br/> 
    <a data-bind="text: supervisor.Email, attr: { href : 'mailto:'+supervisor.Email() }"></a> 
</div> 

每次我運行「詳細信息」部分都不會填入主管詳細信息,即全名和電話號碼。

我調試並確認supervisorVM.supervisor已填充,但數據綁定不起作用。

還試圖下面沒有運氣:

supervisorVM.supervisor(ko.mapping.fromJS(supervisorDetails));

我已經用了2個多小時了,有人能幫我做錯了什麼嗎?

謝謝。

+0

以及它的工作正常我在這裏檢查http://jsfiddle.net/supercool/74dh736s/16/。如果你可以重現這個問題很容易把它整理出來。 – 2015-02-10 11:07:53

+0

事實上,您正在進行查詢調用以顯示Detail div而不是使用布爾值observable,並將綁定如此具體地應用於DOM元素,這使我認爲您沒有適當地使用knockout,並且可能是大多數背後的原因你的奮鬥。 – 2015-02-10 17:35:54

回答

1

您的綁定例如supervisor.Fullname的定義不正確 - 您正在尋找可觀察功能上的屬性「全名」。它應該是supervisor().Fullname

嘗試將字段綁定到with: supervisor綁定。這有很好的副作用,該字段沒有呈現,只要你的AJAX調用還沒有返回,並添加內容supervisor

<div id="Detail" class="side-widget" style="display:none" data-bind="with: supervisor"> 
    <h2>Details</h2> 
    <strong> 
     Supervisor<br> 
     <span data-bind="text: FullName"></span><br/> 
    </strong> 
    <span data-bind="text: PhoneNumber"></span><br/> 
    <a data-bind="text: Email, attr: { href : 'mailto:' + Email() }"></a> 
</div> 

而且,不用更換可觀,因爲你在這裏做的:

supervisorVM.supervisor = ko.mapping.fromJS(supervisorDetails); 

相反,取代他們的內容

supervisorVM.supervisor(ko.mapping.fromJS(supervisorDetails)); 

您的標記已綁定不服老observabl e您分配了supervisor: ko.observable()。您可以用新的觀察值替換該觀察值,但您的標記仍舊綁定到舊的 - 它不會再更新。

+1

'錯誤地定義了'實際上這是正確的方式(基於他的代碼)要做,因爲他不是將數據推送到可觀察的位置,而是指定'='。以及如果他需要使用(())方式(最好的方式),他必須這樣實現:http://jsfiddle.net/supercool/74dh736s/17/ – 2015-02-10 12:35:43

+1

當你用一個新的observable,綁定不會再更新。感謝大家 - 我將在答案中包括這一部分。 – janfoeh 2015-02-10 12:38:18

+0

其實他的代碼工作正常,你可以檢查我的評論與小提琴附在那裏。 – 2015-02-10 12:39:17