1

すべての日付は、バックエンドからISO 8601としてフォーマットされてい2014-01-01T12:45:30Zます。アプリケーション全体で、それらをさまざまな形式で表示したい...

  • 表の略記、例えばJan 1
  • 詳細ビューのより長く、より明確な形式Monday, January 1st

解決策フォーマットを渡すことができるヘルパーを作成しました。簡単です。

can.mustache.registerHelper('formatDate', function(date, format) {
    return date() ? moment(date()).format(format) : '-';
});

問題現在、ブートストラップ datepickerを実装していますが、これらの要件をどのように取得できますか...

  • 私のモデルの日付はISOとしてフォーマットされています
  • can-valueテンプレート内で入力にバインド
  • ユーザーおよび日付ピッカーの表示形式MM/DD/YY

モデルは非常に大きく、多くの日付があるため、モデル内のすべての日付値を計算する必要がない場合のボーナス ポイントです。

4

1 に答える 1

1

残念ながら、これに適した API は (まだ) ありません。ただし、以下のコードを使用すると、モデルのプロパティを元の状態に保ちながら、ビューでカスタム フォーマットを実現できます。

can.view.attr('can-somecustom-value', function(el, data) {
  var attr = el.getAttribute('can-somecustom-value'),
  value = data.scope.computeData(attr, {
    args: []
  }).compute;

  new FormattedValue(el, {
    value: value
    //value is the only one we really care about, but
    //you could specify other arbitrary options here
    //such as "format: 'MM/DD/YYYY' to be used in your __format methods below"
  });
});

var FormattedValue = can.Control.extend({
  init: function () {
    this.set();
  },

  __format: function() {
    // return formatted version of this.options.value;
  },

  __deformat: function() {
    // return this.element[0].value sans format(keeps your model pristine);
  },

  '{value} change': 'set',
  set: function () {
    if (!this.element) {
      return;
    }

    var self = this;

    setTimeout(function() {
      self.element[0].value = self.__format();
    });
  },

  'change': function () {
    if (!this.element) {
      return;
    }

    this.options.value(this.__deformat());
  }
});

これにより、次のことが可能になります。

<input can-somecustome-value="myDateProp"/>

ここで、「myDateProp」は can.Map/can.Model/etc の属性です。

これにより、入力にカスタム文字列形式が表示されますが、 someModel.attr('myDateProp') は引き続き ISO 形式を返します (これは、ISO 形式もサーバーに保存されることを意味します)。

ビューのレンダリングのみに固有のフォーマットを制御できるようにするためのフィルター/パーサーの追加に関して、内部で議論が行われています。

于 2014-09-12T19:36:20.327 に答える