我对Knockout.js相对较新,并且无法使这个计算的observable正常工作。简而言之,我想禁用一个按钮,直到textarea输入。这是HTML:
对于textarea:
<textarea class="form-control" id="Note" name="note" data-bind="value:text1, valueUpdate: 'keyup'" placeholder="Enter note..."></textarea>
按钮:
<btn class="btn btn-maroon" id="saveNote" href="javascript: void(0);" data-bind="enable: hasInput, click: addNoteis"><i class="icon-save"></i>Save Note</btn>
这是我的.js:
var vm = {
text1: ko.observable(""),
}
vm.hasInput = ko.computed(function() {
return this.text1();
}, vm);
ko.applyBindings(vm);
在firebug中运行时,我从控制台收到错误消息:
ReferenceError:未定义text1
我应该补充一点,我正在引用这个小提琴来创建我的代码: http://jsfiddle.net/oliverw/s2VmL/1/
编辑:&#34;点击:addNote&#34;按钮的一部分是用于别的东西。我忘了在这个片段中删除它作为&#34; addNote&#34;功能正常工作。我为这种困惑道歉,我感谢大家注意到它。因此,似乎T.J.已经回答了我的问题。我在ViewModel中使绑定工作不正常,绑定导致冲突。
答案 0 :(得分:0)
我认为您正在查看旧的错误消息。您的问题中显示的问题是您没有在任何地方定义addNote
,但您正试图将click
绑定到它。
如果您添加它并使btn
元素成为实际button
,那么一切都很好:
var vm = {
text1: ko.observable(""),
};
vm.hasInput = ko.computed(function() {
return this.text1();
}, vm);
vm.addNote = function() {}; // <=== Added
ko.applyBindings(vm);
<textarea class="form-control" id="Note" name="note" data-bind="value:text1, valueUpdate: 'keyup'" placeholder="Enter note..."></textarea>
<button type="button" class="btn btn-maroon" id="saveNote" href="javascript: void(0);" data-bind="click: addNote, enable: hasInput"><i class="icon-save"></i>Save Note</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
旁注:完全是FWIW,我更喜欢ko.computed
的新语法,它更明确一些:
vm.hasInput = ko.computed({
owner: vm,
read: function() {
return this.text1();
}
});
这也允许您为上面的pure computed指定pure: true
:
vm.hasInput = ko.computed({
pure: true,
owner: vm,
read: function() {
return this.text1();
}
});