1

現在、このようなチェックボックスのコレクションを作成しています。

いくつかのコンテキスト: 最初は、クライアント側 VM 全体に ko.mapping プラグインを排他的に使用していました。

たとえば、私のコードのコンテキストでは:

self.AllAgencyTypes = ko.mapping.fromJS([]);

self.observables = {   //this would be created by the mapping plugin on render/runtime
    SomeProperty: ko.observable(),
    AgencyTypes: ko.observableArray()
}

画面の読み込み時に適切なチェックボックスがチェックされないことを除いて、チェックボックスが正しくレンダリングされました。その後、checked 属性をテキストに変更する必要があるノックアウトの問題に気付きました。(私の get ajax 呼び出しの成功を参照してください)

HTML

<tbody data-bind="foreach: AllAgencyTypes">
 <tr>
   <td>
    <label class="checkbox inline">
       <input  type="checkbox" class="editorField" data-bind="attr: { value: Id }, 
                           checked: $root.SelectedAgencies" />
       <span class="editorField" data-bind="text: Name"></span>
    </label>
  </td>
 </tr>
</tbody>

ビューモデル

  AgencyDetailsVM: function (options) {

         var self = this;    

         self.AllAgencyTypes = ko.mapping.fromJS([]);

         //added this to get past the check-box bug
         self.SelectedAgencies = ko.observableArray([]); 

         // CRUD Actions
         self.get = function () {
             $.ajax({
                url: options.getURL,
                dataType: 'json',
                success: function (result) {

                    self.observables = ko.mapping.fromJS(result);    

                    //convert to string array
                    self.SelectedAgencies($.Enumerable.From(result.AgencyTypes)
                        .Select(function (x) {
                          return x.Id.toString();
                        }).ToArray()
                    );


                    ko.applyBindings(self, $('form')[0]);
                 }
           });


           $.getJSON(options.getAgencyTypes, function (response) {
                    ko.mapping.fromJS(response, self.AllAgencyTypes);
           });
       };    
 }

私の現在の問題は、保存送信にあります。チェックボックスは新しく作成された監視可能な配列にバインドされているため、サーバー側のモデルにはバインドされていません。

$.ajax({
         url: options.editURL,
         data: self.observables,
         type: "post",
         dataType: "json",    .... 
})

このようなことができれば... 問題が解決するかもしれないという考えがあります...しかし、方法がわかりません。(許可されていない.stringの取得/何かエラーATM。)

<input  type="checkbox" class="editorField" data-bind="attr: { value: Id }, 
                               checked: $root.observables.AgencyTypes.Id.toString()" />

したがって、私が利用できる唯一のオプションは、コレクションを ko.mapping によって作成された元のオブジェクトにプッシュすることです...これも現時点では方法がわかりません...アイデアはありますか?

4

2 に答える 2

1

バインディングはブール値または配列のcheckedいずれかに対してバインドする必要があるため、文字列に対して直接バインドすることはできません。

各アイテムにブール値を追加し、計算されたオブザーバブルを使用して選択されたアイテムを表すことを検討できます。

それ以外の場合は、同期を維持するために、に対して手動サブスクリプションを使用できます。SelectedAgenciesAgencyTypes

于 2012-11-22T16:08:21.830 に答える