我正在使用knockout对模态中包含的表单进行数据绑定。一旦用户提交表单,模式就会在成功的帖子上关闭。我还想清除我的淘汰视图模型中的所有可观察值,以便用户可以打开模态并从头开始提交新表单。我不想丢失已在字段上设置的ko.observable绑定。
对于上下文,我的viewmodel是另一个视图模型的子项。
在我的父视图模型中
self.childElement = ko.observable(new childElementVm());
我的孩子视图模型
var childElementVm = function (){
var self= this;
self.property1 = ko.observable()
self.property2 = ko.observable()
self.property3 = ko.observable()
self.property4 = ko.observable()
self.property5 = ko.observable()
self.property6 = ko.observable()
self.array1 = ko.observableArray()
self.array2 = ko.observableArray()
self.array3 = ko.observableArray()
self.array4 = ko.observableArray()
//several more observables
//a smattering of functions including some self.property.subscribe functions
$.ajax({
//post
}).done(function(){
$('#myModal').modal('hide');
//reset all values in childElementVm
});
}
答案 0 :(得分:4)
每次创建新的视图模型可能更好。您使用Knockout来销毁和重新制作视图模型。 if绑定将添加和删除dom中的元素。如果添加的元素是Knockout组件,则会自动创建它的视图模型。
<div class="myModal">
<-- ko if: isModalPresented -->
<my-child-component params="myChildElementParams"></my-child-component>
<-- /ko -->
</div>
答案 1 :(得分:1)
每次打开模态时都可以放入一个新的视图模型,所以在打开模态时可以这样做:
parentVM().childElementVm(new childElementVm());
我在评论中看到你在childElementVm中有一些订阅,所以如果你这样做,你必须将订阅存储在childElementVm中并在关闭模态时将它们处理掉。这看起来有点像这样:
//Store subscriptions
var subscriptions = [];
subscriptions.push(myViewModel.personName.subscribe(function(newValue) {
alert("The person's new name is " + newValue);
}));
//Dispose
for(var i = 0; i < subscriptions.length; i++){
subscriptions[i].dispose()
}
这将重置您的数据,因为每次打开您的模态时都会有一个全新的childElementVm。
答案 2 :(得分:1)
您可以使用此功能:
function resetObservables(object, defaultValue) {
for (var key in object) {
if (object.hasOwnProperty(key)) {
var property = object[key];
if(ko.isObservable(property)){
property(defaultValue);
}
}
}
}
这样:
$.ajax({
//post
}).done(function(){
$('#myModal').modal('hide');
//reset all values in childElementVm
resetObservables(self,"");
});
答案 3 :(得分:0)
清理一个可观察的只是使用:
ByteBuffer.wrap(bBuffer).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(sBuffer);