2013-06-17 18 views
31

私の見解では、日付を含むknockout.jsバインドフィールドを表示したいと考えています。これは単なる表示フィールドであり、入力フィールドではありません。以下のようなものは次のようしかし、これが表示されているbasemodel.actionDate = ko.observable()Knockout.js形式の日付項目

<p class="display-field" data-bind="text: baseModel.actionDate"/> 

2013-06-17T11:56:18.4537687Z 

このdd mm yyyyをフォーマットする最も簡単な方法は何ですか。例:17 June 2013

+0

あなたが観測可能で 'date'オブジェクトまたは文字列を「保存しています2013- 06-17T11:56:18.4537687Z "? – nemesv

答えて

64

moment.js日付書式設定ライブラリをお勧めします。

それを使用して、あなたはあなたのビューでこのような何かを行うことができます。

<p class="display-field" data-bind="text: moment(baseModel.actionDate()).format('LL')"/> 
+1

ありがとうございます。いいね。しかし、私は "未定義のNaN 0NaN"エラーが表示されます。何か案は? – Martin

+8

ahあなたの 'actionDate'がko.observableならば、'() 'をそこに入れて値を瞬時に渡す必要があります。私はその投稿を修正した。 – Brandon

+0

パーフェクト。ありがとう。 – Martin

12

どちらかあなたはそれをクライアント側をTODOしたいなら、あなたは、DateオブジェクトにISO日付文字列を解析して、jQueryのにグローバル化を使用することができ、クライアント側に正しい形式、またはフォーマットで

をそのサービス出力を確認してくださいフォーマットしてください。

は、私はそれが私がさらす行うことができ、生の日付の値 を取得するために、どのように私のブログ上の質問を得た

この

http://jsfiddle.net/vRf5B/42/

ko.extenders.date = function(target, format) { 
    return ko.computed({ 
     read: function() { 
      var value = target(); 
      if(typeof value === "string") { 
       value = new Date(value);     
      } 

      format = typeof format === "string" ? format: undefined; 
      value = Globalize.format(value, format); 

      return value;   
     }, 
     write: target 
    }); 
} 

更新のためにKOエクステンダーを使用します計算された値の生の値

http://jsfiddle.net/vRf5B/91/

+0

良いお知らせ:サービス出力の変更!私はintiallyこれに..グーグル、その後、私はシリアライズサーバー側を制御することができます思い出した。この行は、ASP.NET MVCアプリケーションが(WebApiConfig.Registerメソッドに配置されている)すべてのJSONシリアル化をどのように処理するかに影響を与えます:GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "dd/MM/yyyy" – bkwdesign

+3

KOまたはAngularでは、実際のDateオブジェクトを使用してロジックを適用できるようにします – Anders

+0

私はあなたのソリューションを試しましたが、あなたのフォーマットで動作していますが、私のフォーマットを入れたい場合は何を変更する必要がありますか?私はそれのようなものを試しましたが、うまくいきません: '' '' '' – YoyoS

1

私はエクステンダーを使用しようとしてマッピング・プラグインで(と思う)いくつかの問題がありました。私は唯一の日付を表示し、それらを許可しないよので、私はちょうどこのような結合ハンドラを使用することを好む編集する:

ko.bindingHandlers.date = 
    { 
     update: function (element, valueAccessor:() => any, allBindingsAccessor: any) 
     { 
      return ko.bindingHandlers.text.update(element, function() 
      { 
       var value: any = ko.utils.unwrapObservable(valueAccessor()); 

       if (value == null) 
       { 
        return null; 
       } 

       if (typeof value === "string") 
       { 
        value = new Date(value); 
       } 

       return value.toShortDateString(); 

      }, allBindingsAccessor, null, null); 
     } 
    }; 

私がプロトタイプを追加することにしました。ここでは

Shipped on <span data-bind="date: shipDt"></span> 

をハンドラですこのようなDateオブジェクト(ハンドラで作成されたDateオブジェクトのtoShortDateString) - しかし、上記のロジックをGlobalizeなどで置き換えることができます。

Date.prototype.toShortDateString = function() 
{ 
    return (this.getMonth() + 1) + "/" + this.getDate() + "/" + this.getFullYear(); 
}; 
0

あなたがmoment.jsを参照している場合は、実際にはノックアウトモデルでフォーマットします。

var BiographicViewModel = function (person) { 
    this.FirstName = ko.observable(person.first_name); 
    this.LastName = ko.observable(person.last_name); 
    this.DOB = ko.observable(moment(person.birth_date).format("MM/DD/YYYY")); 
    this.Gender = ko.observable(person.gender); 
    this.Country = ko.observable(person.country); 
    this.City = ko.observable(person.city);   
}; 
0

宣言フォーマット機能:

Date.prototype.toFormattedDate = function() { 
    var dd = this.getDate(); 
    if (dd < 10) dd = '0' + dd; 
    var mm = this.getMonth() + 1; 
    if (mm < 10) mm = '0' + mm; 
    var yyyy = this.getFullYear(); 
    /* change format here */ 
    return String(mm + "/" + dd + "/" + yyyy); 
}; 

として日付文字列でそれを使用します。

<span data-bind="text: new Date(TaxAuthority.RegDate).toFormattedDate()"></span>