2013-05-17 27 views
2

我跟着淘汰賽創建一個動態列表中的級聯選擇下拉教程一段時間,其中前他們中的一個 http://learn.knockoutjs.com/#/?tutorial=collections如何使用MVC淘汰賽

詳細介紹瞭如何創建列表和集合。 但是我想在列表中創建一個級聯下拉選擇。

我的問題本來是你可以在動態列表中創建一個級聯下拉使用淘汰賽?

事實上,我已經設法解決了這個問題,經過幾個小時的研究後,所以將它添加到這裏作爲答案,因爲我認爲它可能對某人有用。也許有更好的方法來做到這一點?

回答

2

它會工作,但我只會添加一件事:小緩存。基本上,一旦你裝滿了給定的膳食可用餐,你可以創建一個屬性在你的膳食對象來存儲它們。這樣,隨後的電話可能會知道這些飯菜已經加載。我創建了一個可觀察的數組,像這樣:

鑑於此功能從服務器模擬檢索數據:

var mealTypesByKey = []; 
mealTypesByKey[1] = [{ mealName: "Vegemite Sandwich", price: 4.00, mealType: 1}, 
        { mealName: "Cheese Sandwich", price: 34.95,mealType: 2 }, 
        { mealName: "Jam Sandwich", price: 290, mealType: 3 } ]; 
mealTypesByKey[2] = [{ mealName: "Standard (Ham)", price: 15, mealType: 1},   
        { mealName: "Chicken Wrap (Possibly rat)", price: 15, mealType: 1} ]; 
mealTypesByKey[3] = [{ mealName: "Premium (lobster)", price: 34.95,mealType: 2 }, 
        { mealName: "Ultimate (whole zebra)", price: 290, mealType: 3 } ]; 

function serverGetMealsForType(key) { 
    return mealTypesByKey[key]; 
} 

您可以定義如下訂閱的功能:

self.mealType.subscribe(function(newMealType) { 
    if(!newMealType.meals) { 
     newMealType.meals = ko.observableArray([]); 
     newMealType.meals(serverGetMealsForType(newMealType.key)); 
     console.log("meals loaded"); 
    } else { 
     console.log("meals already available for meal type " + newMealType.key); 
    } 
}); 

並且這樣,用給定的綁定適當地重新創建動態列表:

<td><select data-bind="options: mealType().meals, value: meal, optionsText: 'mealName'"></select></td> 

這是避免不必要的服務器調用的常用技巧。

編輯:忘了添加fiddle I've forked

+1

非常感謝! –

+2

我已經添加了一個稍微修改版本的答案,它使用KO Computed而不是訂閱: http://jsfiddle.net/MEwsU/ 這是一個教育活動,而不是任何事情。 –

+0

是的,事實上它甚至更好! – Jalayn

1

我從learn.knockoutjs.com上拿到了原版的集合教程。 我決定添加一個膳食類型選擇,在選擇時改變可用膳食。

我發現可用的膳食需要移動到各個列表項,因爲它是要改變每個

function SeatReservation(name, initialMeal, initialMealType) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 

    // Non-editable catalog data - would come from the server 
    self.availableMeals = ko.observableArray([ 
     { mealName: "Standard (sandwich)", price: 0, mealType: 1}, 
     { mealName: "Premium (lobster)", price: 34.95,mealType: 2 }, 
     { mealName: "Ultimate (whole zebra)", price: 290, mealType: 3 } 
    ]);  

我創建了一頓類型也各預訂中:

self.mealType= ko.observable(); 

然後列出可用膳食類型:

// Non-editable catalog data - would come from the server 
self.availableMealTypes = [ 
    { mealTypeName: "Vege", key: 1 }, 
    { mealTypeName: "Dead Animal", key: 2 }, 
    { mealTypeName: "Meat Whore", key: 3} 
]; 

然後將其綁定t o在HTML中。

最後,我訂閱了一頓類型的變化,並在此函數修改現有的飯菜收集:

self.mealType.subscribe(function() { 
    if (self.mealType().key == 1) 
    { 
     self.availableMeals ([ 
     { mealName: "Vegemite Sandwich", price: 4.00, mealType: 1}, 
     { mealName: "Cheese Sandwich", price: 34.95,mealType: 2 }, 
     { mealName: "Jam Sandwich", price: 290, mealType: 3 } ]); 
    } 

最終的和完整的解決方案可以在this jsFiddle可見。