敲定变量未定义

时间:2015-03-16 15:08:52

标签: javascript knockout.js observable

我对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中使绑定工作不正常,绑定导致冲突。

1 个答案:

答案 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();
  }
});