【问题标题】:How do I show a Knockout observable value in an editable field without changing the value如何在可编辑字段中显示 Knockout 可观察值而不更改值
【发布时间】:2014-02-21 06:27:47
【问题描述】:

我正在尝试创建一个模式窗口,用于从用户那里获取值以发送到服务器。我想用我们当前拥有的值预填充字段,并在模式窗口出现时用当前值(本地存储)更新它们。

我遇到的问题是,当我将字段直接链接到 observable 时,用户将编辑字段,如果他们点击“取消”,前一个屏幕显示的值将包含更新后的值。如果我将它绑定为“值:(),我会得到一个可以编辑的字符串,但如果用户打开它,编辑值,关闭它,然后重新打开它......编辑的更改仍然存在。

是否有人对如何获取表单的更新信息而无需直接链接到 observable 有什么建议?当我调用打开此窗口时,有没有办法刷新这些绑定?

下面是我当前表单的示例。

<form>
   ...
   <div class="control-group">
        <label class="control-label" >Cellular Fault Time (in Minutes)</label>
        <div class="controls">
            <input type="text" class="input-small" id="gsmfaultecptime" maxlength="2" onkeypress='return isNumberKey(event)'
    data-bind="value: gsmfaulttime()">
        </div>
   </div>
   <div class="control-group">
       <label class="control-label" >Cellular IP1</label>
       <div class="controls">
            <input type="text"  readonly class="input-medium" data-bind="value: csip()">
       </div>
    </div>
    ...
   </form>

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    过去我使用过两种方法来处理可恢复的数据元素。

    1. 有一个视图模型专用于每次打开时都会替换的模式。

      launchModal: function () {
       $('#dialog').dialog('open')
       var obs = this.obs;
       var dialogViewModel = {
           anotherObs: ko.observable(obs()),
           accept: function () {
               obs(dialogViewModel.anotherObs())
               $('#dialog').dialog('close')
           },
           cancel: function () {
               $('#dialog').dialog('close')
           }
       }
       ko.applyBindings(dialogViewModel, $('#dialog')[0])
      }
      
    2. 装饰 observable 以提供修改处理。

      self.createSpecialObservable = function () {
         var obs = ko.observable("Greetings")
         obs.originalValue = undefined;
         obs.revert = function () {
           if (obs.originalValue) {
             obs(obs.originalValue)
             obs.originalValue = undefined;
           }
         }
      
         obs.accept = function(){obs.originalValue = undefined}
      
         obs.subscribe(function (newValue) {
           if (!obs.originalValue) {
             obs.originalValue = obs();
           }
         }, null, "beforeChange")
         return obs;
      }
      

      两种用法都可用in this example

    编辑:另见this 示例。

    【讨论】:

    • 我能够使用您的第一个示例的修改版本来使其正常工作。感谢您的帮助!
    猜你喜欢
    • 2015-07-13
    • 2012-09-22
    • 2020-05-04
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2021-10-26
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多