由于我的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>
答案 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)));