6

わかりました、これは初めてではありませんが、日付を取得するのに苦労しています. ;-)

Breeze、Knockoutを使用しています。短い日付を表示したいフォームがあります。

<input name="start" data-bind="value: start" class="date required" required="required" placeholder="mm/dd/yyyy" style=" width:142px"> 

長い dateTime が生成されます: Wed Aug 31 2011 20:00:00 GMT-0400 (東部夏時間)。

目的の短い日付をフォーマットするメソッドを作成すると、短い日付を作成するという目標が達成されますが、私のモデル コンテキストは変更通知を認識しません。したがって、私のオブジェクトは画面に変更を通知しません。クリックなどでdataContextに通知しようとすることで、これをこじ開けることができますが、変換中に失われないことを望んでいます。

function positionInitializer(posit) {

    var shortDate = function (date) {
        return date && moment.utc(date).isValid() ? moment.utc(date).format('L') : "";
    };

    posit.start = ko.observable(shortDate(posit.start()));
}

これを行う方法に関する適切な例はありますか?

クエリ b/c を呼び出したときに変換できないと思います。呼び出しでテーブルの数を増やしていますが、両方を行うことはできません。

        var query = EntityQuery.from('Positions')
        .where('id', '==', id)
        .expand('Company, Projects')
        .orderBy(orderBy.positions);

ハイブマインドが何を考えているか見てみようと思った...

4

3 に答える 3

1

@RyanRahlf あなたの答えは私にいくつかのインスピレーションを与えたので、構成可能なフォーマットと日付検証アドオンをソリューションに提供しました。

私の状況は少し違いました。私の日付は JSON 文字列 (例: 2013-08-02T00:00:00) として入ってくるので、2 つの形式が必要でした。1 つは JSON から、もう 1 つは表示されるもの (ユーザーフレンドリー)

ko.bindingHandlers.date = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var formats = allBindingsAccessor().dateFormats || { from: "", to: "" };
        element.onchange = function () {
            var observable = valueAccessor();
            var value = moment(element.value)
            if (value && value.isValid()) {
                //if format is not set then assume observed is a js date
                if (formats.from) {
                    observable(value.format(formats.from));
                }
                else {
                    observable(value.toDate());
                }
            }
            else {
                observable("");
                //ensures element is blank when invalid input is attempted
                if (element.value) element.value = "";
            }
        };
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var formats = allBindingsAccessor().dateFormats || { from: "", to: "MM/DD/YYYY" };
        var observable = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(observable);
        if (valueUnwrapped) {
            element.value = moment(valueUnwrapped).format(formats.to);
        }
        else {
            element.value = "";
        }
    }
};

使用 (dateFormats はデフォルトでオプション)

<input type="text" data-bind="date: trueDate, dateFormats: { from: 'YYYY-MM-DDTHH:mm:ss', to: 'YYYY/MM/DD' }" />
于 2013-08-02T21:37:21.097 に答える
0

すでに jQuery datepicker を使用していて、別の JavaScript ライブラリを追加したくない場合は、次のように使用できます。

ko.bindingHandlers.textDate = {
        update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
            var value = valueAccessor(),
                allBindings = allBindingsAccessor(),
                valueUnwrapped = ko.utils.unwrapObservable(value),
                pattern = allBindings.datePattern || $.datepicker._defaults.dateFormat,
                valueFormatted = $.datepicker.formatDate(pattern, valueUnwrapped);

            $(element).text(valueFormatted);
        }
    };

ただし、日付型でのみ機能します。

于 2013-09-25T08:46:20.943 に答える