我试图在网页上为类似手风琴的文档布局实现自定义绑定,但我遇到了一个我无法轻易解决的问题。
在页面加载时,我收到错误:
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')">
我究竟做错了什么?
答案 0 :(得分:2)
问题在于这一行:
var section = $(element.text());
element - 此绑定中涉及的DOM元素
text
是一个jQuery函数而不是DOM函数,所以我认为你正在寻找类似的东西:
$(element).text()
或$($(element).text())
代替?我认为前者更有意义。
至于嵌套的绑定处理程序我不知道为什么它在viewmodel中,因为它暴露在淘汰全局对象上,你不会保护自己免受任何让你的代码更难以理解的东西。它们设计为可恢复的,因此您可以将它们与不同的viewModel一起使用