Knockout:更改输入框值也会更改Root JSON对应值

时间:2017-04-25 15:20:12

标签: knockout.js

由于我的root json发生了变化,我无法重置我的实际数据。 即使在我的订阅功能中,我正在使用旧值,此值也会使用更改的输入框

进行更新

https://jsfiddle.net/asnastudio777/m4oh8x57/

var jsonObj = {
    "value": "abc"
}
   function ViewModel (){
      this.someReview = ko.observable();
      this.prevValue =jsonObj;
   };
   var json = jsonObj;
   function ViewModelPrev (){
      this.someReviewPrev = ko.observable();
   };
   var vm = new ViewModelPrev();
   vm.someReviewPrev(json)
   ko.applyBindings(new ViewModel().someReview(jsonObj), document.getElementById('inputBox'));
   $('input').on('change', function(){
      
       $('#inputTest').text( 'Prev: ' + JSON.stringify(vm.someReviewPrev().value) + '\n' +
       'Current: ' + JSON.stringify(json))
   })
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
   <p> Enter your reviews here: <br><br>
   <input type="text" data-bind="textInput: someReview().value" id="inputBox"/><br>
       
   </p>
   <div id="inputTest"></div>
</body>

4 个答案:

答案 0 :(得分:1)

您将一个普通对象存储在一个observable中。您的textInput数据绑定绑定到此普通对象中的不可观察属性。这意味着您的输入值仅在您应用绑定时设置,并且没有更新或双向值同步。

解决方案是使value属性可观察。

我还提供了一些“架构”更改,向您展示如何在没有jQuery的情况下调试/构建。

  • ko.computed用于创建viewmodel结构的调试视图
  • 我已将您的objJSON重命名为obj,因为它不是JSON。
  • 我已绑定到body元素并使用with绑定来定位输入

var obj = {
  "value": "abc"
}

function Review(data) {
  this.value = ko.observable(data.value);

  this.exportVM = ko.computed(function() {
    return {
      value: this.value()
    };
  }, this);
}

function App(reviewData) {
    this.someReview = new Review(reviewData);
    
    this.exportVM = ko.computed(function() {
      return {
        someReview: this.someReview.exportVM()
      };
    }, this);
    
 };
 
 ko.applyBindings(new App(obj));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div data-bind="with: someReview">
  <input type="text" data-bind="textInput: value"/>
</div>


<pre data-bind="text: JSON.stringify(exportVM(), null, 2)"></pre>

答案 1 :(得分:1)

尝试制作对象的副本,然后使用该副本进行编辑 喜欢 var newJob = ko.mapping.fromJS(ko.mapping.toJS(job));

答案 2 :(得分:1)

根据你提到的答案,extend方法执行使变量clonedObj不可变的相同任务。 此外,您可以在声明时对clonedObj进行字符串化。

答案 3 :(得分:0)

我得到了解决方案: 我们可以使对象不可变,如将对象转换为stringify,然后再将其解析为JSON,然后在视图上绑定它

绑定时 例如:

$.extend(clonedObj, MainObject);
myModelObject.modelProperty(JSON.parse(JSON.stringify(clonedObj)));