Knockout 的日期格式问题和同步到 Breeze .js entityAspect 已修改

标签 date knockout.js breeze

好的,所以这不是第一次,但我很难约会。 ;-)

我正在使用 Breeze , knockout 。有一个我希望显示短日期的表格。

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

产生一个长日期时间:2011 年 8 月 31 日星期三 20:00:00 GMT-0400(东部夏令时间)。

创建一个格式化所需短日期的方法可以实现创建短日期的目标,但我的 modelContext 不知道任何更改通知。所以我的对象不会通知屏幕更改。我可以通过尝试在点击时通知 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);

我想我会看看 hive 思维是怎么想的……

最佳答案

使用 Knockout 处理日期格式有几个不错的选择。

可写计算

您可以为您的日期值创建一个可写计算并在那里进行所有格式化和解析。例如:

var myViewModel = function(){
    var self=this;
    self.trueDate = ko.observable(new Date());
    self.formattedDate = ko.computed({
        read: function(){
            return moment(self.trueDate()).format('L');
        },
        write: function(value){
            self.trueDate(moment(value).toDate());
        }
    });
}

<input type="text" data-bind="value: formattedDate" />

任何时候支持的 observable "trueDate"被更新,它的观察者都会被提醒。

自定义绑定(bind)

另一种方法是构建自定义数据绑定(bind),以在绑定(bind)期间格式化数据并保持 View 模型简单。
var myViewModel = function(){
    var self=this;
    self.trueDate = ko.observable(new Date());
}

ko.bindingHandlers.dateString = {
    init : function(element, valueAccessor) {
        //attach an event handler to our dom element to handle user input
        element.onchange = function(){
            var value = valueAccessor();//get our observable
            //set our observable to the parsed date from the input
            value(moment(element.value).toDate());
        };
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(value);
        if (valueUnwrapped) {
             element.value = moment(valueUnwrapped).format('L');
        }
    }
};

(请记住,上面的绑定(bind)代码未经测试,不检查无效输入等)

然后你的绑定(bind)将是
<input type="text" data-bind="dateString : trueDate" />

我更喜欢自定义绑定(bind)方法,因为它可以轻松地用于其他日期和 View 模型。自定义绑定(bind)还可以读取该元素上的其他绑定(bind),因此您可以将日期格式字符串配置为绑定(bind),而不是将其硬编码为“L”。

我希望这有帮助!

关于Knockout 的日期格式问题和同步到 Breeze .js entityAspect 已修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001303/

相关文章:

python - 只保留某一天 python 的最后一个时间戳

Ruby 日期减法(例如 90 天前)

asp.net-mvc - 我有理由使用 Knockout MVC 而不是 Knockout JS 吗?

javascript - RequireJS、KendoUI 和 KnockoutJS 有机会一起工作吗?

javascript - 选择日期后打开第二个日期选择器

breeze - breeze.js 中的服务器端验证和安全性

Lua中的日期格式toUTCString

javascript - new Date() 12/24 小时格式 JavaScript?

knockout.js - 使用 moment.js 格式化 Breeze 检索到的日期。 Hot Towel 模板

javascript - 使用 foreach 内部的键值对进行 knockout 绑定(bind)