2012-11-22 6 views
6

Tworzę formularz edycji dla użytkownika, role użytkownika nie są domyślnie wybierane podczas wielokrotnego wyboru.Knockout multiple select selectedOptions nie wybrano przy załadowaniu

Dostępne są dwie role aplikacji: "Administrator" i "Moderator". Przykładowy użytkownik ma 1 rolę "Administrator". Ten nie jest domyślnie wybrany.

http://jsfiddle.net/jgT8s/4/

html:

<form data-bind="with: user"> 
    <select id="selectRoles" 
     data-bind="options: $root.allRoles, selectedOptions: Roles, optionsText: 'Name', optionsValue: 'Id'" 
     multiple="true" 
     size="5"> 
    </select> 
</form> 

JS:

var User = function() { 
    var self = this; 

    self.Id = ko.observable(1337); 
    self.Username = ko.observable('pietpaulusma'); 
    self.Roles = ko.observableArray([{ Id: 1, Name: 'Administrator' }]); 
}; 

function UserViewModel() { 
    var self = this; 

    self.user = ko.observable(new User()); 
    self.allRoles = ko.observableArray([{ Id: 1, Name: 'Administrator' }, { Id: 2, Name: 'Moderator' }]); 
} 

ko.applyBindings(new UserViewModel()); 

UPDATE stworzył dependentObservable i odwzorowany, że jeden do selectedOptions

self.RoleIds = ko.dependentObservable(function() { 
     return ko.utils.arrayMap(self.Roles(), function (role) { 
      return role.Id; 
     }); 
    }); 

wersja robocza: http://jsfiddle.net/jgT8s/5/

+0

To świetna wskazówka dotycząca dependObservable .. wstydu musimy iść na takie długości .. –

Odpowiedz

6

Problemem jest to, że Roles zawiera „pełny” obiekt natomiast powinien on zawierać tylko część wartość:

self.Roles = ko.observableArray([1]); 

Spójrz tutaj: http://jsfiddle.net/Vkda5/

+1

thanx! Stworzyłem dependObservable, który zwróci wszystkie Ids of Roles http://jsfiddle.net/jgT8s/5/ byłoby miło, gdyby nokaut mapował obiekty z opcją optionsValue tho. – Bas

+0

@Bas: Zgadzam się - konsekwentne używanie opcji "optionsValue" byłoby świetne. –

3

Knockout musi porównać wybrane opcje o wartości, która jest Id w tym przypadku: optionsValue: 'Id'. I przechodzisz przez szereg obiektów Role. Trzeba przekazać tablicę Id zamiast:

var User = function() { 
    ... 
    self.Roles = ko.observableArray([1]); 
}; 
+0

Najpierw odpowiedź, ale nie zaakceptowana odpowiedź .. ?? +1 ode mnie. –

+0

Czy ktoś wie, jak mieć obiekty zamiast tylko identyfikatory? – AlexRebula

+0

Kluczową sprawą jest to, że określając "optionsValue:", ustawiasz dokładnie to, do czego lista jest związana, nawet jeśli twoje bindowanie "options:" wskazuje na tablicę obiektów, zajęło mi trochę czasu, aby to zrozumieć. – Shaun

Powiązane problemy