2015-11-16 33 views
0

我正在創建一個會議出席管理器,並且信息正被保存到我們的數據庫中。我的登錄表單上有一個名爲「Attendee Type」的下拉選擇列表,其中包含從名爲attendeeTypes的可觀察數組填充的值。與會者類型充滿
{ID:1,產品名稱: 「父」}形式的對象
{ID:2,產品名稱: 「員工」},等等。現在Knockout JS設置從可觀察數組對象屬性值下拉的初始值

,在我的表中的行也通過在可觀察數組上運行foreach來動態創建,以滿足使用者。

與會者
self.meetingAttendees = ko.observableArray([{ AttendeeTypeId: ko.observable(1),<br> AttendeeNames: ko.observableArray([{ Name: "Marlin" }, { Name: "Dory" }]),<br> AttendeeSiteNumber: ko.observable(40), <br>StudentNames: ko.observableArray([{ Name: "P. Sherman" }, { Name: "42 Wallaby Way" }, { Name: "Sydney" }]), <br>Email: ko.observable("[email protected]"), <br>Telephone: ko.observable("559-222-5555") }

正如你可以看到,表中的每一行中有一個attendeeTypeId。如果此值是預填充的,就像它在這裏一樣,我希望下拉菜單切換到適當的值。這將有助於在發生刷新時保存數據。

我的HTML:
<table class="table table-responsive table-condensed table-bordered table-striped"> <thead> <tr> <th class="attendeeTypeCol">Attendee Type</th> <th class="attendeeNameCol">Attendee Name(s)</th> <th class="schoolNameCol">School Name</th> <th class="studentNameCol">Student Name</th> <th class="emailCol">E-Mail Address</th> <th class="telephoneCol">Telephone Number</th> </tr> </thead> <tbody data-bind="foreach: $root.meetingAttendees"> <tr> <td class="attendeeTypeCol"> <select style="margin-right: 15px;" data-bind="options: $root.attendeeTypes, optionsText: 'Name',value: $root.meetingAttendees()[$index()].AttendeeTypeId,optionsValue: 'Id', optionsCaption: 'I am a(n)...'"> </select> <span data-bind="text:$index()"></span> <span data-bind="text:$root.meetingAttendees()[$index()].AttendeeTypeId()"></span> </td> ... </tr> </tbody> </table>

我有兩個調試跨越,讓我總能看到的$值root.meetingAttendees()[$指數()] AttendeeTypeId()。當我從下拉列表中選擇一個值時,該值會進行相應的更新和更改,因此我確信它正在查找正確的位置,但在初始加載時,值綁定不會將下拉列表設置爲適當的選項。它實際上將該變量設置爲默認的「未定義」。

有沒有人有任何想法,我可以如何讓下拉菜單從$ root.meetingAttendees()[$ index()]中的Id中設置適當的值。AttendeeTypeId()?

+0

我無法在一個更簡單的提琴手https://jsfiddle.net/y51r3x9g/1/上重現您的問題......您可以看看您是否可以在那裏重現它? –

+0

我在這裏更新了那個小提琴。 https://開頭的jsfiddle。net/y51r3x9g/5/ 在這裏,它正在工作。但我已經把我的整個JS留在了那裏。我在想可能會出現比賽狀況? 此外,我在Knockout 3.3.0,如果這有所作爲。 –

+1

經過進一步的調試,我發現問題的根源。這是我的ajax調用self.getAttendeeTypes。它不喜歡我清空並重新插入值。它以某種方式混淆了綁定。所以我想這就是解決方案所在的地方 –

回答

0

這個問題的答案是評論中所說的。

感謝Quango進行驗證。

對於敲除界限選擇列表,必須在應用綁定之前填充列表。

我的AJAX調用在綁定之前沒有完成,因此我的列表綁定observable被設置爲默認值「undefined」。

通過在函數中包裝我的綁定,並在使用$ .ajax({})。done( - call function--)完成AJAX調用時調用此函數,可以確保列表將在綁定被應用。

正如Quango所說,如果列表是靜態的,最好在HTML中注入選項,但這對於動態加載的列表非常有用。

「是的,在綁定列表和綁定值時要小心綁定順序 - 我也已經跳過了它,列表必須在綁定值之前填充,否則列表爲空,那麼這個值被設置爲undefined。有很多不同的方法可以解決這個問題 - 它取決於列表是靜態的還是動態的。對於靜態列表,如果可能的話,可以將值注入到HTML中。方法是將相同AJAX調用中的值作爲模型數據傳遞,因此viewmodel同時具有列表和數據。「 - Quango

相關問題