如何在不更改值的情况下在可编辑字段中显示Knockout可观察值

时间:2014-01-31 17:22:54

标签: knockout.js

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

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

有没有人就如何获取表单的更新信息而不必直接链接到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>

1 个答案:

答案 0 :(得分:0)

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

  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

  3. 修改:另请参阅this示例。