【问题标题】:KnockoutJS datetime picker in observable array可观察数组中的 KnockoutJS 日期时间选择器
【发布时间】:2013-08-20 21:39:58
【问题描述】:

我正在尝试使用敲除创建一个页面,该模型包含一个可观察数组。每个数组项中的属性之一是日期,我正在尝试使用 jquery ui datepicker。

我在this question 中找到了日期选择器的自定义绑定处理程序示例。但是,当我尝试在我的代码中使用它时,我在更改事件处理程序期间收到了一个 javascript 错误。

我的简化代码:

<table>
    <thead>
        <tr>
            <th>My Date</th>
        </tr>
    </thead>
    <tbody data-bind='foreach: visits'>
        <tr>
            <td><input data-bind='datepicker: MyDate' /></td>
        </tr>
     </tbody>
</table>

<script type="text/javascript">
    ko.bindingHandlers.datepicker = {
        init: function(element, valueAccessor, allBindingsAccessor) {
           $(element).datepicker({ dateFormat: 'dd/mm/yy' });

           //handle the field changing
           ko.utils.registerEventHandler(element, "change", function() {
               //get the value accessor
               var observable = valueAccessor();

               //assign the observable value - code breaks here with 'Function expected'
               observable($(element).datepicker("getDate"));
            });

            //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());

            //handle date data coming via json from Microsoft
            if (String(value).indexOf('/Date(') == 0) {
                value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
            }

            var current = $(element).datepicker("getDate");

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

    var VisitModel = function(visits) {
        var self = this;
        self.visits = ko.observableArray(visits);

        self.getVisitsJSON = function() {
            return ko.utils.stringifyJson(self.visits);
        }
     };

     var visitModel = new VisitModel([{"MyDate":"01/01/2013"}]);
     ko.applyBindings(visitModel);
</script>

在我的代码中的 cmets 中,当我调用 observable($(element).datepicker("getDate")); 时,我收到一条错误消息“预期功能”。我对 knockoutjs 很陌生,我不知道为什么会出现这个错误,有人可以帮忙解释一下吗?

【问题讨论】:

  • 但是我链接的另一个问题是使用该行的代码回答的,您可以在 jsfiddle.net/rniemeyer/NAgNV 看到它的工作原理
  • 问题是,虽然您的数组是 observableArray,但其中的元素不是。您绑定的值只是一个普通的 javascript 对象。

标签: javascript jquery jquery-ui knockout.js jquery-ui-datepicker


【解决方案1】:

您需要将数组的内容包装到它们自己的具有可观察属性的视图模型中。这样的事情可能会奏效:

var VisitModel = function(visits) {
    var self = this;
    self.visits = ko.observableArray();

    for (var i = 0; i < visits.length; i++) {
        self.visits.push(new DateModel(visits[i]);
    }

    self.getVisitsJSON = function() {
        return ko.utils.stringifyJson(self.visits);
    }
 };

 var DateModel = function(date) {
     var self = this;
     self.MyDate = ko.observable(date.MyDate);
 }

 var visitModel = new VisitModel([{"MyDate":"01/01/2013"}]);
 ko.applyBindings(visitModel);

现在,当您使用valueAccessor 时,您应该返回ko.observable,它是一个函数。

【讨论】:

  • 感谢您的回答,我已经将它添加到我现有的代码中,但是现在当我调用我的 getVisitsJSON 方法时,DateModel 中的任何属性(我现在称之为 VisitDataModel,它有一个少数可观察的属性)不包含在返回的 JSON 字符串中。为什么会发生这种情况?
  • ko.utils.stringifyJson 不处理数组中的嵌套属性,但我发现 ko.toJSON 可以。现在每个人都工作了,感谢您的帮助。
猜你喜欢
  • 2020-08-13
  • 2012-04-20
  • 1970-01-01
  • 2015-03-20
  • 2016-07-19
  • 2017-11-25
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多