ko.toJSON没有获取更新的可观察值

时间:2016-09-27 16:36:43

标签: javascript jquery knockout.js

我坚持通过knockout.js的ko.toJSON收集json数据。有几个可观察的变量,我可以在用户输入一些字符串时收集一些输入字段,但是当用户点击按钮时无法获得按钮状态。

html代码:

<input type="text" name="port_name"
  class="form-control"
       data-bind="value: portName"
       placeholder="Enter name of port" />
<span class="input-group-btn">
  <button class="btn btn-switch" 
          data-bind="css: btnStatus" 
          data-toggle="button"
          data-bind="aria-pressed: btnIsPressed"
          autocomplete="off">
    <i class="fa" data-bind="css: btnName"></i>
  </button>
</span> 

如果用户在&#34; port_name&#34;字段并单击按钮,然后使用ko.toJSON(viewmodel)提交整个表单我可以获取json字符串,其中portName是用户编写的,但按钮状态如&#34; btnIsPressed&#34;永远不会改变,但只保持初始价值。还试图添加点击功能来强制值,但它没有帮助...

$(function() //click funcion for Port Enable buttons
{
}).on('click', '.btn-switch', function(e) {
  if (this.getAttribute("aria-pressed") == true) {
    this.setAttribute("aria-pressed", false);
    console.log(this.getAttribute("aria-pressed"));
  } else {
    this.setAttribute("aria-pressed", false);
    console.log(this.getAttribute("aria-pressed"));
  }
});

从控制台我可以看到&#34; aria-pressed&#34;值切换但ko.toJSON结果始终为初始值。我错过了什么?感谢。

viewmodel如下:

//PortViewModel
function Port(_port_id, 
              _port_is_enabled,
              _max_number_of_ports_per_module,
              _id_of_last_port) {
    this.portId = ko.observable(_port_id); 
    var portStatus = _port_is_enabled;
    this.portName = ko.observable("No Name");//_port_name;

    this.btnStatus = ko.pureComputed(function() {
        return (_port_is_enabled) ?
                "btn-success" : "active btn-danger";
    });

    this.btnIsPressed = ko.observable(_port_is_enabled);

    this.btnName = ko.pureComputed(function() {
        return (_port_is_enabled) ? "fa-play" : "fa-stop";
    });
}

1 个答案:

答案 0 :(得分:0)

找到原因,只有部分knockout.js的绑定支持双向绑定。因此需要更改viewmodel来修复此问题,如另一个线程中所讨论的那样。见(Two way binding on attribute, knockout.js