Knockout.js 敲除:更改输入框值也会更改根JSON对应的值

Knockout.js 敲除:更改输入框值也会更改根JSON对应的值,knockout.js,Knockout.js,由于根json中的更改,我无法重置实际数据。 即使在我的subscribe函数中,当我获取oldvalue时,该值也会随着输入框的更改而更新 var jsonObj={ “价值”:“abc” } 函数视图模型(){ this.someReview=ko.observable(); this.prevValue=jsonObj; }; var json=jsonObj; 函数ViewModelPrev(){ this.someReviewPrev=ko.observable(); }; var

由于根json中的更改,我无法重置实际数据。 即使在我的subscribe函数中,当我获取oldvalue时,该值也会随着输入框的更改而更新

var jsonObj={
“价值”:“abc”
}
函数视图模型(){
this.someReview=ko.observable();
this.prevValue=jsonObj;
};
var json=jsonObj;
函数ViewModelPrev(){
this.someReviewPrev=ko.observable();
};
var vm=新的ViewModelPrev();
vm.someReviewPrev(json)
applyBindings(newviewmodel().someReview(jsonObj),document.getElementById('inputBox');
$('input')。在('change',function()上{
$('#inputTest').text('Prev:'+JSON.stringify(vm.someReviewPrev().value)+'\n'+
'当前:'+JSON.stringify(JSON))
})

在此处输入您的评论:



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

解决方案是使
属性可见

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

  • 使用
    ko.computed
    创建viewmodel结构的调试视图
  • 我已经将您的
    objJSON
    重命名为
    obj
    ,因为它不是JSON
  • 我已经绑定到
    body
    元素,并使用
    绑定来定位输入
var obj={
“价值”:“abc”
}
职能审查(数据){
this.value=ko.可观察(data.value);
this.exportVM=ko.computed(函数(){
返回{
value:this.value()
};
},这个);
}
功能应用程序(查看数据){
this.someReview=新审核(reviewData);
this.exportVM=ko.computed(函数(){
返回{
someReview:this.someReview.exportVM()
};
},这个);
};
ko.应用绑定(新应用(obj))

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

解决方案是使
属性可见

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

  • 使用
    ko.computed
    创建viewmodel结构的调试视图
  • 我已经将您的
    objJSON
    重命名为
    obj
    ,因为它不是JSON
  • 我已经绑定到
    body
    元素,并使用
    绑定来定位输入
var obj={
“价值”:“abc”
}
职能审查(数据){
this.value=ko.可观察(data.value);
this.exportVM=ko.computed(函数(){
返回{
value:this.value()
};
},这个);
}
功能应用程序(查看数据){
this.someReview=新审核(reviewData);
this.exportVM=ko.computed(函数(){
返回{
someReview:this.someReview.exportVM()
};
},这个);
};
ko.应用绑定(新应用(obj))

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

装订时 例如:

$.extend(clonedObj,main对象);
myModelObject.modelProperty(JSON.parse(JSON.stringify(clonedObj))我得到了解决方案:
我们可以使对象不可变,比如将对象转换为stringify,然后再次将其解析为JSON,然后在视图上绑定它

装订时 例如:

$.extend(clonedObj,main对象);

myModelObject.modelProperty(JSON.parse(JSON.stringify(clonedObj))尝试创建对象的副本,然后使用该副本进行编辑 喜欢
var newJob=ko.mapping.fromJS(ko.mapping.toJS(job))

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

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

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

嘿,谢谢您的回答。我的问题是,每当我从输入更改值时,我不想更新我的json。我无法使我的值属性可见,因为我已创建了我的整个div可观察,然后其中的一个元素仅与json属性绑定。谢谢对于你的回答,我的问题是我只是不想更新我的json,每当我从输入更改我的值时,我不能使我的值属性可见,因为我已经创建了我的整个div可观察,然后其中的元素只是与json属性绑定