2012-11-22 17 views
6

ユーザーの編集フォームを作成していますが、複数選択でユーザーのロールがデフォルトで選択されていません。ノックアウト複数選択selectedOptionsがロード時に選択されていません

"管理者"と "モデレーター"という2つのアプリケーションロールがあります。サンプルユーザーには1つの役割 "Administrator"があります。これはデフォルトでは選択されていません。

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は はdependentObservableを作成し、マップされたそのselectedOptionsに1

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

作業バージョン:optionsValue: 'Id'http://jsfiddle.net/jgT8s/5/

+0

これは、従業員の観察に関する素晴らしいヒントです。私たちはそのような長さに行かなければなりません。 –

答えて

6

問題はそれだけで価値の一部が含まれている必要があり、一方、Rolesは「完全な」オブジェクトが含まれていることである。

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

はこちらをご覧ください:http://jsfiddle.net/Vkda5/

+1

ありがとう!私は、すべてのidのロールを返すdependentObservableを作成しました。http://jsfiddle.net/jgT8s/5/ knockoutがoptionsValueプロパティthoでオブジェクトをマップしていればいいと思います。 – Bas

+0

@Bas:私は同意します - 'optionsValue'を一貫して使うことは素晴らしいでしょう。 –

3

ノックアウトは、この場合にIdある値によって選択されたオプションを比較する必要があります。そして、Roleオブジェクトの配列を渡しています。あなたは代わりにIdの配列を渡す必要があります。

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

最初に回答しましたが、受け入れられた回答はありません.. ??私の+1。 –

+0

誰かがIDだけでなくオブジェクトを持つ方法を知っていますか? – AlexRebula

+0

ここで重要なのは、 'optionsValue:'を指定することによって、 'options:'バインディングがオブジェクトの配列を指していても、リストがバインドされているものを正確に設定していることです。 – Shaun

関連する問題