2
var mappingSetting = {
  'user' : {
      create: function(options.data){
          options.data.isActive = options.data.isActive == 1 ? 'Yes' : 'No';
          options.data.startDate = $.datepicker.format('dd/MM/yy', options.data.startDate)
          return options.data;
          }
     }
};

var viewModel = {};

$.ajax({
   url: '/api/users/GetAll',
   .....
   success: functions (data) {
       viewModel = ko.mapping.fromJS(data, mappingSetting);
       ko.applyBindings(viewModel);
   },
});

$("#savebtn").click(function(){
    var dataToSave = ko.toJS(viewModel);
    // ajax call to save
});

ajaxの結果

[{username: 'users1', isActive:1, startDate:'2001-03-22T00:00:00CET'}, {username: 'users2', isActive:0, startDate:'2008-03-22T00:00:00CET'}]

isActiveに基づいてYes/Noを表示する必要がありますが、保存中にそれを0/1に戻す必要があります。

私は多くのフィールドと日付(ローカルカルチャーフォーマット)を持っています。

4

1 に答える 1

1

isActive をブール値として保持し、計算された関数またはカスタム バインディング ハンドラーを使用して、isActive の値を指定して「はい」/「いいえ」を表示することをお勧めします。

カスタム バインディング ハンドラ

ko.bindingHandlers.formatBool = {
  update: function(element, valueAccessor, allBindingsAccessor) {
     var value = ko.utils.unwrapObservable(valueAccessor());
     var text = value ? "Yes" : "No";

     ko.bindingHandlers.text.update(element, function() { return text; });
  }
};

例としてjsFiddleを次に示します。

計算された「フォーマットされた」値

マッピング プラグインを使用して viewModel 全体を構築しているため、これは最善の解決策ではない可能性がありますが、通常は、計算された を使用して他の監視可能な値をフォーマットすると便利です。

viewModel.options.data.isActive.formatted = ko.computed(function(){
  return viewmodel.options.data.isActive ? "Yes" : "No";
});

toJSON をオーバーライドする

そうは言っても、本当に toJS/toJSON 関数をオーバーライドしたい場合は、ビュー モデルでこれらのメソッドをオーバーライドできます。

viewModel.toJSON = function(){
  var copy = ko.toJS(this);
  copy.isActive = copy.isActive === "Yes" ? 1 : 0;
  return copy;
}

これがどのように行われるかを正確に説明している Ryan Niemeyer による素晴らしい記事があります。

于 2013-06-18T04:02:25.917 に答える