2013-04-13 31 views
0

我正在使用knockout和breeze,現在正在SELECT HTML標籤上工作。將輸入SELECT標籤外部的(敲除)foreach移開給我帶來麻煩問題

下面是實際執行:

<select data-bind="value: vehicleId, foreach: $root.vehicles()"> 
    <option data-bind="text: registration(), value: id()"></option> 
</select> 

在運行時,它看起來像這樣:

enter image description here

出於測試目的,我重構這個代碼。所以我將foreach移開SELECT。

這裏是新的實現:

<select data-bind="value: vehicleId"> 
    <!-- ko foreach: $root.vehicles() --> 
     <option data-bind="text: registration(), value: id()"></option> 
    <!-- /ko --> 
</select> 

enter image description here

當我測試頁面,我注意到,與第二實施預期的微風沒有工作。當我更新數據時(在任何輸入中),微風不再檢測到我的更新。通常,當我更新我的頁面上的內容時,我有datacontext.hasChanges()這是真的。然後我顯示按鈕,如Save,Cancel。現在情況並非如此。如果我回到原始實施,它再次運作。我很奇怪。

有什麼想法?

謝謝。


編輯

我也看看這個:knockout.js: using a containerless foreach on a <select> fails in Internet Explorer 8

,但它似乎並不工作之一。

+0

好奇。如果第一次實施有效,爲什麼需要改變?我會假設選擇標籤引發更改事件。從技術上講,只有在選擇標籤的情況下,您的選項值纔會改變。另外,您的「註冊」和「身份證」不需要是KO可觀察對象,是嗎? KO可以做單向綁定,並非所有事情都是可觀察的。 – mikekidder

+0

需要改變測試目的並理解'爲什麼'和'如何'。我的所有元素都是可觀察的,因爲在這之後是來自微風的查詢... – Bronzato

+0

你有什麼變化,沒有更新?某些外部數據綁定對象的'vehicleId'?很難說,沒有更多的信息 – Ward

回答

0

您發佈在底部的鏈接絕對正確 - 評論將從選擇框中刪除。

問題不是Breeze不能正常工作 - 而是視圖中的Knockout綁定正在打破,特別是選擇框中的值綁定。有兩種方法可以在這裏完美地工作,第一種是您首先發布的方法,而且這種方法可行。第二個是使用計算的選項綁定,這是我更喜歡的方法。

<select data-bind="value: selectedVehicle, options: vehicleOptions, optionsText: 'registration'"></select> 

,並在您的視圖模型具有計算觀察到的陣列

var selectedVehicle = ko.observable(); 
var vehicleOptions = ko.computed(function() { 
    var myArr = []; 
    if (!selectedVehicle) { return myArr; } 
    return myArr = (refreshVehicles()); 
}); 
function refreshVehicles() { 
    // Go get vehicles or w/e based on selectedVehicle 
    var locVehicles = getVehicles(selectedVehicle()); 
    return locVehicles; 
} 

這做了幾件事情 -

  1. 這聽起來像你正在使用級聯某種下拉菜單,並只要selectedVehicle發生變化,計算結果將被重構。如果它不是級聯的,那麼你可以跳過這個並直接設置vehicleId或w/e的值。

  2. 它消除了額外的無容器綁定的需要,它還通過將邏輯移入視圖模型來清理視圖。