【问题标题】:Knockout JS: `hasFocus` always has Focus淘汰赛 JS:`hasFocus` 总是有焦点
【发布时间】:2014-05-01 23:10:41
【问题描述】:

背景

我有一个单视图模型和两个模型。对于每个模型,我都在尝试将 name 属性绑定到 dom。每个名称都有默认值,但我希望用户能够编辑这些值。在 Knockout 文档之后,我使用了 hasFocus 方法。我的问题是,点击时,我可以编辑,但是当我点击出去时,焦点不会改变,我的数组也不会更新。看起来我的模型editable 属性永远不会设置回false。见下面对应的 HTML 和 JS。

那我做错了什么?这是我用于故障排除的清单(无济于事)...

  1. 确保名称是可观察的。
  2. 确保editing 是可观察的。
  3. 确保我的edit 函数将editing 设置为true
  4. 确保editing 默认为false
  5. 确保<input> 具有value 绑定。
  6. 确保<i> 具有text 绑定。
  7. 确保事件处理程序绑定到editing 的值

JSBinhttp://jsbin.com/fehoq/117/edit

JS

function StudentModel(fullName) {
    var _this = this;
    this.fullName = ko.observable(fullName);
    this.editing = ko.observable(false);
    this.edit = function() { 
        _this.editing(true); 
        console.log(_this.editing());
    }; 
    ...
}

HTML

<tbody>
  <!-- ko foreach: students -->
    <tr>
        <td>
          <input data-bind="value: fullName()  + ' ' + ($index() + 1), visible: editing(), hasFocus: editing()"/>
          <i data-bind="visible: !editing(), text: fullName() + ' ' + ($index() + 1), click: edit">&nbsp;</i>
        </td>  
...

       

【问题讨论】:

    标签: javascript html knockout.js ko.observablearray


    【解决方案1】:

    您可能希望将hasFocus 绑定到可观察对象本身,以便可以将错误值写回给它。所以,你会想要:

    hasFocus: editing 而不是hasFocus: editing()

    在后者中,绑定只接收值,无法返回到可观察对象写入。

    【讨论】:

    • 我明白了。这在技术上解决了我的问题。不幸的是,虽然我现在可以失去焦点,但我的数组仍然没有更新新值。对那个有什么想法吗?
    • 基本上是同类型的issue。对于value,您需要直接绑定fullName,因此可以对其进行写入。如果您确实需要索引作为输入框中值的一部分(而不是在输入框中的元素中),那么您可以使用可写计算。如果您在该方向上需要帮助,请告诉我。
    • 将索引放在其他地方对我有用。改天我将不得不学习可写计算;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2015-02-28
    相关资源
    最近更新 更多