【问题标题】:Knockout DatePicker bound item doesn't disable the DatePicker淘汰 DatePicker 绑定项目不会禁用 DatePicker
【发布时间】:2014-03-27 00:29:27
【问题描述】:

我有一个用于日期选择器的自定义 knockoutJs 绑定。

ko.bindingHandlers.valueAsDatePicker = {...}

当绑定的输入字段状态(启用/禁用)绑定到 KO observable 时,它​​不会启用/禁用日期选择器图标。

HTML

<input id="txtRequestedTo" type="text" placeholder="dd/mm/yyyy" 
data-bind="valueAsDatePicker: reqDateTo, disable: reqDateFrom().length < 1" />

自定义绑定

ko.bindingHandlers.valueAsDatePicker = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor);
        formatAndSetDateValue(element, valueAccessor, allBindingsAccessor);

        // Init UI datepicker
        var dateFormat = allBindingsAccessor.dateFormat 

        $(element).datepicker({
            dateFormat: dateFormat,
            changeMonth: true, 
            changeYear: true, 
            yearRange: '1900:' + new Date().getFullYear(), 
            maxDate: 0, 
            showOn: "button",
            buttonImage: "Content/images/sprite-base/sprite/icon-calender.png",
            buttonImageOnly: true,
            constrainInput: false, 
            buttonText: ""          
        });
    },
    update: function(element, valueAccessor, allBindingsAccessor) {
        // Use the value binding
        ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor);
        formatAndSetDateValue(element, valueAccessor, allBindingsAccessor);

        valueAccessor().valueHasMutated(); 
    }
};

如果元素被禁用,我希望日期选择器被禁用,反之亦然。

【问题讨论】:

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


    【解决方案1】:

    感谢一百万罗伯特,

    这是有效的解决方案。

    使用 KnockOutJS V3.1

    init: function (element, valueAccessor, allBindings) {
    ...
    
    //Disable the datepicker if the item is disabled or enabled.
        if (allBindings.has('disable')) {
            if (allBindings.get('disable')()) {
                $(element).datepicker('disable');
            }
            else {
                $(element).datepicker('enable');
            }
            var subscription = allBindings.get('disable').subscribe(function (newValue) {
                if (newValue) {
                    $(element).datepicker('disable');
                } else {
                    $(element).datepicker('enable');
                }
            });
    
            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                subscription.dispose();
            });
        }
    }
    

    你必须使用

    if (allBindings.has('disable')) {
    

    否则

    allBindings.get('disable')
    

    将未定义,因为视图中并非所有日期选择器绑定字段都具有禁用属性。

    【讨论】:

      【解决方案2】:

      这里的诀窍是将禁​​用的绑定作为可观察对象访问,以便您可以附加手动订阅。目前禁用表达式的结果被传递给 bindingHandler(通过 allBindingAccessor)。

      如果您获得订阅,您可以调用 DatePicker 的禁用选项

      HTML

      <input id="txtRequestedTo" type="text" placeholder="dd/mm/yyyy"
          data-bind="valueAsDatePicker: reqDateTo, disable: reqDateFrom.disabled" />
      

      JAVASCRIPT

      var reqDateFrom = ko.observable();
      var reqDateTo = ko.observable();
      reqDateTo.disabled = ko.computed( function() { 
           return (reqDateFrom() || '').length === 0; 
      } );
      
      
      ko.bindingHandlers.valueAsDatePicker {
          init: function(element, valueAccessor, allBindingsAccessor) {
              ....
              // ko 3.0 syntax.  For 2.x use allBindingAccessor['disable']
              var subscription = allBindingAccessor.get('disable').subscribe( function(newValue) {
                  $(element).datepicker('option', 'disabled', newValue);
              });
      
              // Make sure the subscription is disposed when the element is torn down
              ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                  subscription.dispose();
              });
          },
          update: function(element, valueAccessor, allBindingsAccessor) {
          }
      }
      

      【讨论】:

      • 谢谢罗伯特,我今天会试试这个,如果我有任何问题会告诉你。
      • disable observable 替换效果很好,我喜欢它的简洁性。装订部分有一些错别字,但它仍然不起作用。我目前正在调试它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多