Knockout.js无法处理绑定:undefined不是函数?

时间:2015-04-19 22:13:34

标签: javascript knockout.js

我试图在网页上为类似手风琴的文档布局实现自定义绑定,但我遇到了一个我无法轻易解决的问题。

在页面加载时,我收到错误:

Uncaught TypeError: Unable to process binding "accordion: function (){return currentAccordionSection }"
Message: undefined is not a function

我尝试将我的observable声明为函数,通常在data-bind语法中声明没有成功。我用默认值(null)初始化了我的observable并且它没有解决这个问题。以下是我的整个ViewModel:

var libraryViewModel = function () {
var self = this;

ko.bindingHandlers.accordion = {
    update: function (element, valueAccessor) {
        console.log(ko.unwrap(valueAccessor()));
        var value = ko.unwrap(valueAccessor());
        var section = $(element.text());

        //ko.bindingHandlers.css.update(element, function () {
        //    if (value === section) {
        //        return 'library-section-active';
        //    }
        //});

        //ko.bindingHandlers.css.update($(element).children('i:last-child').get(0), function () {
        //    if (value === section) {
        //        return 'fa fa-chevron-up';
        //    } else {
        //        return 'fa fa-chevron-down';
        //   }
        //});
    }
}

self.currentAccordionSection = ko.observable(null);
self.updateAccordionSection = function (section) {
    self.currentAccordionSection(section);
}

}

上面的一些代码被注释掉了,因为它与手头的问题无关,我已经禁用它来实现一个简化的测试用例来缩小问题范围。这是我的约束声明:

<h2 class="library-header" data-bind="accordion: currentAccordionSection, click: updateAccordionSection.bind('Text')">

我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

问题在于这一行:

 var section = $(element.text()); 

根据knockout's documentation

  

element - 此绑定中涉及的DOM元素

text是一个jQuery函数而不是DOM函数,所以我认为你正在寻找类似的东西:

$(element).text()$($(element).text())代替?我认为前者更有意义。 至于嵌套的绑定处理程序我不知道为什么它在viewmodel中,因为它暴露在淘汰全局对象上,你不会保护自己免受任何让你的代码更难以理解的东西。它们设计为可恢复的,因此您可以将它们与不同的viewModel一起使用