7

我知道有类似的问题,但我真的找不到适合我的问题的答案。

我有这个HTML表女巫正在通过一个数组循环 - 在我的 viewModel 中定义:

<div class="formElement" id="AssimilationDT" style="overflow-x: auto; width: 100em;">           
               <table class="dataTable">
<thead>
    <tr>
        <th> 1 </th>
        <th> 2 </th>
        <th> 3</th>
        <th> 4</th>
        <th> 5</th>
        <th> 6</th>
        <th> 7</th>
        <th> 8</th>
        <th> 9</th>
        <th> 10</th>
        <th> 11</th>
        <th> 12/th>
        <th> 13</th>
        <th> 14</th>
        <th> 15</th>
        <th> 16</th>
        <th></th>
    </tr>   
</thead>
<tbody data-bind="foreach: assimilationRows">
    <tr>
        <td><input type="text" name="AssimilationDate" id="AssimilationDate" data-bind="event: { mouseover: assimilationDatePicker}, value: AssimilationDate"></td>
        <td><input type="text" name="InvoiceSum" data-bind="value: InvoiceSum"></td>
        <td><input type="text" name="FondAssimAmm" data-bind="value: FondAssimAmm"></td>
        <td><input type="text" name="FondSgebFondPerc" data-bind="value: FondSgebFondPerc"></td>
        <td><input type="text" name="FondWholeAssimPerc" data-bind="value: FondWholeAssimPerc"></td>
        <td><input type="text" name="SgebAssimAmm" data-bind="value: SgebAssimAmm"></td>
        <td><input type="text" name="SgebFondSgeb" data-bind="value: SgebFondSgeb"></td>
        <td><input type="text" name="SgebWholeAssimPerc" data-bind="value: SgebWholeAssimPerc"></td>
        <td><input type="text" name="FondSuppl" data-bind="value: FondSuppl"></td>
        <td><input type="text" name="FondSupplNum" data-bind="value: FondSupplNum"></td>
        <td><input type="text" name="FondSupplInvNum" data-bind="value: FondSupplInvNum"></td>
        <td><input type="text" name="FondDesc" data-bind="value: FondDesc"></td>
        <td><input type="text" name="SgebSuppl" data-bind="value: SgebSuppl"></td>
        <td><input type="text" name="SgebSupplNum" data-bind="value: SgebSupplNum"></td>
        <td><input type="text" name="SgebSupplInvNum" data-bind="value: SgebSupplInvNum"></td>
        <td>
                <img src="/HDSHubCreditMonitoring/js/images/close.jpg" alt="Close" data-bind="click: $root.removeAssimilationRow"> 
        </td>
    </tr>
</tbody>
</table>
<button type="button" id="newSupplierRow" class="button" data-bind="click: newAssimilationRow">Добави Ред</button>
           </div>

我在 viewModel 中拥有的是以下代码 - 包含表格行,它应该执行.datepicker

AssimilationInfo = function(clientNum){
                    this.AssimilationDate = null;
                    this.InvoiceSum = null;
                    this.FondAssimAmm = null;
                    this.FondSgebFondPerc = null;
                    this.FondWholeAssimPerc = null;
                    this.SgebAssimAmm = null;
                    this.SgebFondSgeb = null;
                    this.SgebWholeAssimPerc = null;
                    this.FondSuppl = null;
                    this.FondSupplNum = null;
                    this.FondSupplInvNum = null;
                    this.FondDesc = null;
                    this.SgebSuppl = null;
                    this.SgebSupplNum = null;
                    this.SgebSupplInvNum = null;
                    this.SgebDesc = null;
                    assimilationDatePicker = (function() {
                        $( "#AssimilationDate" ).datepicker({
                            yearRange: "-20:+100",
                            changeMonth: true,
                            changeYear: true,
                            dateFormat: "d-M-y"
                        });
                    });
                },

newAssimilationRow = function (){
                      this.assimilationRows.push(new AssimilationInfo(this.clientNumber()));
                  },

                  removeAssimilationRow = function (ca){
                      assimilationRows.remove(ca);
                  },

上述函数是在 HTML 表中添加或删除行。我面临的问题.datepicker是它只在第一个表行上工作 - 如果我添加另一行,它就是不工作。

我很确定我不能正确调用它,但是作为初学者,我无法发现这个问题。有没有办法datepicker在每个表行上调用?

更新

我添加了

assimilationDatePicker = (function() {
                        $( ".AssimilationDate" ).datepicker({
                            yearRange: "-20:+100",
                            changeMonth: true,
                            changeYear: true,
                            dateFormat: "d-M-y"
                        });
                    });

现在它显示在每一行上,但只有第一行输入的值被更新。

4

7 回答 7

6

更新后您面临的问题是为所有日期选择器使用相同的 id。您应该从 datepicker 元素中删除 id,然后 jquery-ui 将自动生成它,一切都会正常工作。我已经修改了@Kishorevarma 的一点 jsbin 代码演示


另外,我建议您对 datepicker 使用自定义绑定,是一个很好的例子。

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

        $el.datepicker(options);

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

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

    },
    update: function(element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()),
            $el = $(element);

        //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 = $el.datepicker("getDate");

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

然后你只需要替换你的输入

<input data-bind="datepicker: myDate, datepickerOptions: {
                        yearRange: "-20:+100",
                        changeMonth: true,
                        changeYear: true,
                        dateFormat: "d-M-y"
                    }" />

这比使用 mouseover 事件更清晰、更易读。

于 2013-10-28T14:28:24.913 回答
3

如果您调用datepicketusing ID,它将仅适用于一个元素。您需要为元素设置一个公共类,该类需要显示一个 datepicket,如下所示

假设,您设置了class类似class="datepicketTxt"

然后datepicker像这样调用

                    $( ".datepicketTxt").datepicker({
                        yearRange: "-20:+100",
                        changeMonth: true,
                        changeYear: true,
                        dateFormat: "d-M-y"
                    });
于 2013-10-17T07:13:10.333 回答
2

我希望这肯定能解决你的问题。我在这里写了一个示例代码

 http://jsbin.com/UgELONO/2/edit

干杯

于 2013-10-28T09:31:25.243 回答
2

你的问题的答案很明显,我通过举例来解释我的答案,你有一个元素和一个像这样的 jquery

<input type="text" name="AssimilationDate" id="AssimilationDate" data-bind="event: { mouseover: assimilationDatePicker}, value: AssimilationDate">

正确的?现在如果你看到你的 id 是AssimilationDate但问题是一个控件每页有一个唯一的 id 所以这是不可能的

现在该怎么办?我现在接受两个输入

<input type="text" name="AssimilationDate" id="AssimilationDate" class="Assimilation" data-bind="event: { mouseover: assimilationDatePicker}, value: AssimilationDate">


 <input type="text" name="AssimilationDate1" class="Assimilation"  id="AssimilationDate1" data-bind="event: { mouseover: assimilationDatePicker}, value: AssimilationDate">

你的javascript函数看起来像这个

assimilationDatePicker = (function() {
                        $( ".Assimilation" ).datepicker({
                            yearRange: "-20:+100",
                            changeMonth: true,
                            changeYear: true,
                            dateFormat: "d-M-y"
                        });
                    });

这仅适用于两个控件,您可以使用类将其乘以 n 次,因此,如果您想使用一个控件,则只需使用 id,如果多个控件,则在多个 id 中使用相同的类,我希望这将有助于您获得解决方案。

于 2013-10-25T05:22:46.410 回答
2

每页只能有一个ID,必须是唯一的,应用datepicker时使用一个类作为多个元素的选择器。

于 2013-10-29T05:30:42.613 回答
1

每次通话使用不同 <script></script> 的标签。

于 2013-10-28T06:55:18.827 回答
1

将函数“assimilationDatePicker”的内容更改为

   $(arguments[1].target).datepicker({
                yearRange: "-20:+100",
                changeMonth: true,
                changeYear: true,
                dateFormat: "d-M-y"
            });

您可以在此处阅读有关使用事件绑定时传递的参数的文档

http://knockoutjs.com/documentation/event-binding.html

于 2013-10-22T12:53:08.290 回答