从可观察的角度获取绑定

时间:2014-04-28 14:23:03

标签: knockout.js knockout-validation

如何获得可观察到的data-bind字符串或DOM节点?我在我的网页上使用knockout.validation.js,我的一个默认验证(required)被解雇了。我想知道它在哪个内部,例如validateSync @ knockout.validation.js

2 个答案:

答案 0 :(得分:0)

您可以使用jquery获取data-bind属性的实际值

<span data-bind="value: test"> </span>


$(function() {
   // this will get you "value: test"
   alert($('span').attr('data-bind'));
});

此外,如果你想获得你绑定的实际observable,你可以使用ko.dataFor函数。

ko.dataFor(element) - 返回可用于绑定元素的数据 ko.contextFor(element) - 返回DOM元素可用的整个绑定上下文。

http://knockoutjs.com/documentation/unobtrusive-event-handling.html

答案 1 :(得分:0)

过了一会儿,我带来了这样的东西:

    function getPath(source, propertyName /*, value, result, noDescend */) {
        var result = arguments[3] || {};
        var valueToFind = arguments[2];
        var noDescend = arguments[4];

        function merge(dst, name, src) {
            var result = {};
            result[name] = src;

            return $.extend(true, dst, result);
        }

        for (var p in source) {
            var value = source[p];
            if (p == propertyName) {
                if (!valueToFind || source[p]==valueToFind) {
                    result[p] = source[p];
                }
            }
            else {
                if (!noDescend && (typeof value == 'object' || typeof value == 'function')) {
                    if (ko.isObservable(value)) {
                        var r = getPath(value, propertyName, valueToFind, result[p], true);

                        if (Object.keys(r).length > 0) merge(result, p, r);
                    }

                    var r = getPath(ko.utils.unwrapObservable(value), propertyName, valueToFind, result[p]);
                    if (Object.keys(r).length > 0) merge(result, p, r);
                }
            }
        }

        return result;
    }

此函数将为您提供一个对象,该对象仅包含名称propertyName上的属性(尽管其嵌套级别)。被搜索的对象是source。解决方案基于以下事实:当一个observable被绑定时,它具有字段_id。这是一个有用的功能的用例。

  1. 在一个非平凡的形式中,字段绑定到一个非平凡的视图模型,其中一个字段会中断验证。

  2. if的函数validateSync中的knockout.validation.js语句的true-path中放置断点后,通过调用以下方法检查obeservable的ID:

    observable._id
    
  3. 调用以下命令获取所有中断验证的字段:

    getPath(ko.dataFor($('<form-selector>')[0]),'_id',<id-of-observable>)
    
  4. 如果有人找到更好的解决方案,请与我分享。