【问题标题】:How do I set up custom bindings for DateTimes with breeze.js?如何使用微风.js 为 DateTimes 设置自定义绑定?
【发布时间】:2014-02-22 20:07:42
【问题描述】:

我正在尝试从数据库中拉回 DateTime 对象(使用微风),然后尝试将格式化的日期显示为绑定,以便可以对其进行编辑并将其保存回数据库。问题是,沿着这条线的某个地方,日期失去了它们的“实体性”。我尝试使用此站点和其他站点中的自定义绑定和计算出的可观察示例,以尝试维护我所有的日期“实体性”,但似乎没有任何效果,我可以格式化日期或保存它。

这是我尝试使用的自定义绑定 sn-p 的示例:

    ko.bindingHandlers.datetimevalue = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            // Use the value binding
            ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor);

            // Provide a custom text value
            var value = valueAccessor(), allBindings = allBindingsAccessor();
            var dateFormat = "DD/MM/YYYY h:mm a";
            var strDate = ko.utils.unwrapObservable(value);
            if (strDate) {
                var date = moment(strDate).format(dateFormat);
                $(element).val(date);
            }
            else {
                var date = moment(new Date()).format(dateFormat);
                $(element).val(date);
            }
        },
        update: function (element, valueAccessor, allBindingsAccessor) {
            // Use the value binding
            ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor);

            // Provide a custom text value
            var value = valueAccessor(), allBindings = allBindingsAccessor();
            var dateFormat = "DD/MM/YYYY h:mm a";
            var strDate = ko.utils.unwrapObservable(value);
            if (strDate) {
                var date = moment(strDate).format(dateFormat);
                $(element).val(date);
            }
        }
    };

在此示例中(取自this link),日期以指定格式显示,但不会保留回服务器。如何使用微风/时刻显示格式化日期,然后保存对此格式化日期所做的任何更改?

提前致谢,

低频率

【问题讨论】:

  • 我可以热情地推荐knockoutjs.com/documentation/custom-bindings.html 上的文档(如果您还没有阅读它;)
  • 我想知道你是否正确地维护了对象——即使你覆盖了 Breeze 对象的原型的值,它仍然应该保持赋予它“实体性”的东西,除非你也清除了原型.
  • 我同意@pw-kad,在查看了微风文档后,我得出了结论,但由于我自己没有编码经验,我无法从任何提供官方文档(微风/淘汰网站)。在brewjs 文档中它说:“不要更改日期的一部分并期望实体更改其EntityState。它不会!您的更改可能不会被保存。”在breezejs.com/documentation/date-time。事情是我必须遗漏一些明显的东西,因为似乎没有其他人遇到这个问题:(。

标签: javascript datetime knockout.js breeze momentjs


【解决方案1】:

您不必使用淘汰赛自定义绑定; Breeze and moment together 可以通过将订单表扩展到您想要的任何内容来为您完成这项工作。

你会在你的问题中加入一些有用的细节......但我认为这个想法是相同的。不过,我还是以订单表为例。

假设您想以"DD/MM/YYYY h:mm a"的格式向客户显示订单日期

var manager = new breeze.EntityManager(remoteServiceName); // remoteServiceName is a string representing your controller path
 var Order = function() {
    this.formattedOrderDate = ko.computed(function () {
    var dt = this.orderDate();
    var value = (dt && moment.utc(dt).isValid()) ?
    moment.utc(dt).format('DD/MM/YYYY h:mm a') : '[Unknown]';
    return value;
    });
    }
manager.metadataStore.registerEntityTypeCtor('Orders',Order);

这将以所需格式显示日期。 更新:在调用 saveChanges() 之前将 orderDate() 属性设置为计算值:

order.setProperty("orderDate", new Date(order.formattedOrderDate()));
// Then....

manager.saveChanges();

回答您的问题可能为时已晚,但我认为这可能会有所帮助

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多