【问题标题】:knockout get observables bound to DOM element淘汰获取绑定到 DOM 元素的 observables
【发布时间】:2013-10-26 17:32:45
【问题描述】:

我正在为淘汰赛制作一个只读绑定。

如果我将绑定应用到每个元素,我就可以很好地工作,如以下小提琴所示:http://jsfiddle.net/paulinfrancis/wDJ9n/

但是,我希望能够将绑定设置为视图的根元素,而不是每个表单元素:

<div data-bind="readonly: isReadonly">
    <!-- My form elements here -->
</div>

ko.bindingHandlers.readonlyView = {
init: function(element, valueAccessor){
    var isReadOnly = ko.unwrap(ko.unwrap(valueAccessor()));
        if (isReadOnly) {
            var $elements = $(':text, :radio, :checkbox, :input', $(element));
            $elements.each(function(){
                var domElement = this;

                ko.cleanNode(domElement);

                var $domElement = $(domElement);

                if ($domElement.is(':text')) {
                    //I need the observable bound to the textbox text
                } else if ($domElement.is(':radio')) {
                    //I need to determine if the radio btn is checked
                } else if ($domElement.is(':checkbox')) {
                    //I need to determine if the checkbox is checked
                } else if($domElement.is(':input')) {
                    $domElement.prop('disabled', true);
                }
            })
        }
    }
}

我不确定如何获取元素绑定到的视图模型属性名称,以便我可以用我选择的只读对应项替换现有元素。

我可以使用 dataFor 或 contextFor 访问我需要的值,但我需要先知道绑定的属性名称:

ko.dataFor(domElement)['observableOne']()
ko.contextFor(domElement).$data['observableOne']()

我当然可以解析每个元素的 data-bind 属性,但这似乎很脏。还有其他更好的方法吗?

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    您确定 Knockout“启用”或“禁用”绑定对您不起作用吗? 这些都可以共享相同的“只读”可观察标志。

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

    <p>
      Your cellphone number:
      <input type='text' data-bind="value: cellphoneNumber, enable: hasCellphone" />
    </p>
    
    ...
    
    var viewModel = {
        hasCellphone : ko.observable(false),
        cellphoneNumber: ""
    };
    

    【讨论】:

    • 它们绝对可以,但我想删除文本框之类的元素,而只显示文本。选中的复选框将显示为复选标记等。归根结底,这一切都归结为美学。
    【解决方案2】:

    根据您对 7zark7 的评论,我认为您真正想要的是 ififnot 绑定:

    <label>Had caffeine fix
      <img src="checkmark.png" data-bind="if: isReadOnly() && coffeeConsumed()">
      <input type="checkbox" data-bind="ifnot: isReadonly, checked: coffeeConsumed">
    </label>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2013-03-02
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多