【问题标题】:KnockoutJS date binding issue, using jQuery datepickerKnockoutJS 日期绑定问题,使用 jQuery datepicker
【发布时间】:2012-03-22 02:08:22
【问题描述】:

我在将日期绑定到我的视图模型上的对象时遇到问题。我有一个从服务器获取的日期。

 var viewModel = {
    profile : ko.mapping.fromJS(initialData),

我将属性绑定到一个文本框。

<input data-bind="datepicker: profile.Birthdate()" />

我正在使用我在这里找到的自定义绑定:http://jsfiddle.net/rniemeyer/NAgNV/

    ko.bindingHandlers.datepicker = { 
init: function(element, valueAccessor, allBindingsAccessor) { 
    //initialize datepicker with some optional options 
    var options = allBindingsAccessor().datepickerOptions || {}; 
    $(element).datepicker(options); 

    //handle the field changing 
    ko.utils.registerEventHandler(element, "change", function () { 
        var observable = valueAccessor(); 
        ko.observable($(element).datepicker("getDate")); 
        $(element).blur();
    }); 

    //handle disposal (if KO removes by the template binding) 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
        $(element).datepicker("destroy"); 
    }); 

}, 
update: function(element, valueAccessor) { 
    var value = ko.utils.unwrapObservable(valueAccessor()), 
        current = $(element).datepicker("getDate"); 

    if(value != null)
    {
        if(value.toString()[0] = "/")
            value = new Date(parseInt(value.toString().substr(6)));
    } 

    if (value - current !== 0) { 
        $(element).datepicker("setDate", value); 
    }
} 

};

我添加了 if(value.toString()[0] = "/") 用于格式化显示在文本框中的日期。

这似乎工作得很好,除非我尝试保存对象添加将它发送回服务器。我添加了一个警报来验证,在我将对象发送到服务器之前,日期没有变化。

 save : function(){
        alert(this.profile.Birthdate);

关于我做错了什么有什么想法吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: asp.net asp.net-mvc-3 jquery-ui knockout.js jquery-ui-datepicker


    【解决方案1】:

    在下一行中,如果您的条件语句中只有一个=,请确保您使用的是==

    if(value.toString()[0] == "/")

            

    【讨论】:

    • 感谢您的回复。我进行了更改,但值仍未更改。我认为这与绑定有关。当我执行以下操作时更糟。 data: ko.toJSON(this) 业务对象的出生日期为 null
    • 你能把你有的东西扔到 jsfiddle 上吗?我在这个例子中添加了一个保存方法,更新的值来自:jsfiddle.net/NAgNV/188
    • 再次感谢您!我看了看,它确实有效……但不适用于我的解决方案。我认为这个问题可能与我的业务对象将通过 C# 业务对象淘汰这一事实有关。您是否使用 C# 业务对象和映射插件完成此操作?让它发挥作用是一个技巧吗?
    • 这正是我们正在做的,我们正在创建一个产品配置平台,其中客户端完全使用从序列化为 json 的 C# 对象填充的淘汰视图模型来实现。您能否提供一个发送到 ko 映射实用程序的 json 示例?不用担心,我们会弄清楚的:)
    • 打印 Json 对象并将其发送给您的最佳方式是什么?
    【解决方案2】:

    我怀疑这与您绑定它的方式有关。当您执行 profile.Birthdate() 时,您传递的是实际值而不是可观察值。所以请尝试改变

    <input data-bind="datepicker: profile.Birthdate()" />
    

    <input data-bind="datepicker: profile.Birthdate" />
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2013-01-03
      相关资源
      最近更新 更多