Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可观测数组中的KnockoutJS日期时间选择器_Javascript_Jquery_Jquery Ui_Knockout.js_Jquery Ui Datepicker - Fatal编程技术网

Javascript 可观测数组中的KnockoutJS日期时间选择器

Javascript 可观测数组中的KnockoutJS日期时间选择器,javascript,jquery,jquery-ui,knockout.js,jquery-ui-datepicker,Javascript,Jquery,Jquery Ui,Knockout.js,Jquery Ui Datepicker,我试图使用knockout创建一个页面,该模型包含一个可观察的数组。每个数组项中的一个属性是日期,我正在尝试使用jQueryUIDatePicker 我在中找到了一个用于日期选择器的自定义bindingHandler示例。然而,当我试图在代码中使用它时,我在更改事件处理程序中遇到了一个javascript错误 我的简化代码: <table> <thead> <tr> <th>My Date</t

我试图使用knockout创建一个页面,该模型包含一个可观察的数组。每个数组项中的一个属性是日期,我正在尝试使用jQueryUIDatePicker

我在中找到了一个用于日期选择器的自定义bindingHandler示例。然而,当我试图在代码中使用它时,我在更改事件处理程序中遇到了一个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>

我的约会对象
ko.bindingHandlers.datepicker={
init:function(元素、valueAccessor、allBindingsAccessor){
$(元素).datepicker({dateFormat:'dd/mm/yy'});
//处理字段更改
registerEventHandler(元素“change”,function()){
//获取值访问器
var可观测=valueAccessor();
//分配可观察值-此处代码以“预期函数”分隔
可观察($(元素).datepicker(“getDate”);
});
//处理处置(如果KO通过模板绑定移除)-
ko.utils.domNodeDisposal.addDisposeCallback(元素,函数(){
$(元素)。日期选择器(“销毁”);
});
},
更新:函数(元素、值访问器){
var value=ko.utils.unwrapobbservable(valueAccessor());
//处理来自Microsoft的json的日期数据
if(字符串(值).indexOf('/Date(')==0){
value=新日期(parseInt(value.replace(/\/Date\(.*?\)\//gi,$1));
}
当前变量=$(元素).datepicker(“getDate”);
如果(值-当前!==0){
$(元素).datepicker(“setDate”,值);
}
}
};
var VisitModel=功能(访问){
var self=这个;
自我访问=可观察到的访问次数;
self.getVisitsJSON=function(){
return ko.utils.stringifyJson(self.visions);
}
};
var visitModel=新的visitModel([{“MyDate”:“01/01/2013”}]);
ko.应用绑定(visitModel);

与代码中的注释一样,当我调用
observable($(element.datepicker(“getDate”))时,我得到一个错误,说“Function expected”)
。我对knockoutjs很陌生,我不知道为什么会出现此错误,有人能帮我解释一下吗?

您需要将数组的内容包装到他们自己的视图模型中,并具有可观察的属性。类似的方法可能会起作用:

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);
var VisitModel=函数(访问){
var self=这个;
self.visions=ko.observearray();
对于(var i=0;i

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

但是我链接的另一个问题是,代码正好使用了这一行来回答,您可以看到它的工作问题是,当您的数组是
observableArray
时,其中的元素不是。您绑定的值to只是一个普通的javascript对象。谢谢你的回答,我已经将它应用到我现有的代码中,但是现在当我调用getVisitsJSON方法时,DateModel中的任何属性(我现在称它为VisitDataModel,它有一些属性)返回的JSON字符串中不包含可观察的属性。为什么会发生这种情况?ko.utils.stringifyJson不处理数组中的嵌套属性,但我找到了ko.toJSON,它可以。现在每个人都可以工作了,感谢您的帮助。