Javascript 杜兰达尔单音问题
当我离开这个组合时,它仍然将数据保存在输入中。当我离开后,我如何使可观察对象不记得值,这样当我再次启动此合成时,就会很清楚您可以使用激活事件来设置初始值Javascript 杜兰达尔单音问题,javascript,jquery,singleton,durandal,Javascript,Jquery,Singleton,Durandal,当我离开这个组合时,它仍然将数据保存在输入中。当我离开后,我如何使可观察对象不记得值,这样当我再次启动此合成时,就会很清楚您可以使用激活事件来设置初始值 define(['durandal/app', 'jquery'], function (app) { return { self: this, title: 'Client Data', canSubmit: ko.observable(false), personalNumber: ko.observab
define(['durandal/app', 'jquery'], function (app) {
return {
self: this,
title: 'Client Data',
canSubmit: ko.observable(false),
personalNumber: ko.observable().extend({
required: true,
minLength: 11,
maxLength: 11
}),
documentNumber: ko.observable(),
documentType: ko.observable(),
country: ko.observable(),
firstName: ko.observable(),
middleName: ko.observable(),
lastName: ko.observable(),
citizenship: ko.observable(),
age: ko.observable(),
sex: ko.observable(),
city: ko.observable(),
currentAddress: ko.observable(),
registrationAddress: ko.observable(),
phone: ko.observable(),
mobile: ko.observable().extend({
required: true
}),
email: ko.observable().extend({
email: true
}),
canSubmit: function(){
app.trigger('formIsValid:event', self.errors().length == 0);
return self.errors().length == 0;
},
validate: function () {
if (!self.canSubmit()) self.errors.showAllMessages();
},
compositionComplete: function () {
//alert(apiLocation());
$(document).on("keydown", ".personalID", function (k) {
if(k.keyCode == 13)
$(this).blur();
})
$(document).on("change", ".personalID", function () {
});
},
errors: ko.validation.group(self),
deactivate: function () {
self = null;
},
};
编辑另一个选项是手动实例化视图模型
activate: function () {
this.phone("");
this.citizenship("");
//....
},
在父视图模型中实例化新模型
define(['durandal/app', 'jquery'], function (app) {
var ctor=function(){
this.phone("");
//...
}
return ctor;
});
然后在HTML中指定视图模型实例
activate:function{
this.myViewModel=new myViewModel();
}
您可以使用激活事件设置初始值
define(['durandal/app', 'jquery'], function (app) {
return {
self: this,
title: 'Client Data',
canSubmit: ko.observable(false),
personalNumber: ko.observable().extend({
required: true,
minLength: 11,
maxLength: 11
}),
documentNumber: ko.observable(),
documentType: ko.observable(),
country: ko.observable(),
firstName: ko.observable(),
middleName: ko.observable(),
lastName: ko.observable(),
citizenship: ko.observable(),
age: ko.observable(),
sex: ko.observable(),
city: ko.observable(),
currentAddress: ko.observable(),
registrationAddress: ko.observable(),
phone: ko.observable(),
mobile: ko.observable().extend({
required: true
}),
email: ko.observable().extend({
email: true
}),
canSubmit: function(){
app.trigger('formIsValid:event', self.errors().length == 0);
return self.errors().length == 0;
},
validate: function () {
if (!self.canSubmit()) self.errors.showAllMessages();
},
compositionComplete: function () {
//alert(apiLocation());
$(document).on("keydown", ".personalID", function (k) {
if(k.keyCode == 13)
$(this).blur();
})
$(document).on("change", ".personalID", function () {
});
},
errors: ko.validation.group(self),
deactivate: function () {
self = null;
},
};
编辑另一个选项是手动实例化视图模型
activate: function () {
this.phone("");
this.citizenship("");
//....
},
在父视图模型中实例化新模型
define(['durandal/app', 'jquery'], function (app) {
var ctor=function(){
this.phone("");
//...
}
return ctor;
});
然后在HTML中指定视图模型实例
activate:function{
this.myViewModel=new myViewModel();
}
只需在viewModel(模块)定义函数中返回构造函数而不是对象
data-bind="compose: { model:myViewModel, view:'myView.html' }"
这样,每次激活viewmodel时,都会创建一个新实例。如果出于某种原因需要单例,那么应该在停用中添加额外的逻辑以清除这些值
你真的需要单身吗
编辑:
然后,在UI中,您可以将特定区域与模型绑定,并使用$parent使用属于viewmodel的函数或属性:
define(['durandal/app', 'jquery'], function (app) {
var vm = function(){
var self = this;
this.title= 'Client Data';
this.canSubmit = ko.observable(false);
this.model = ko.validatedObservable({
personalNumber: ko.observable().extend({
required: true,
minLength: 11,
maxLength: 11
}),
documentNumber: ko.observable(),
documentType: ko.observable(),
country: ko.observable(),
firstName: ko.observable(),
middleName: ko.observable(),
lastName: ko.observable(),
citizenship: ko.observable(),
// .....
});
this.errors = ko.validation.group(this.model);
this.mustValidate = ko.observable(true);
//... add the properties
this.canSubmit = function(){
app.trigger('formIsValid:event', self.errors().length == 0);
return self.errors().length == 0;
}
//... add the methods
};
return vm;
};
只需在viewModel(模块)定义函数中返回构造函数而不是对象
data-bind="compose: { model:myViewModel, view:'myView.html' }"
这样,每次激活viewmodel时,都会创建一个新实例。如果出于某种原因需要单例,那么应该在停用中添加额外的逻辑以清除这些值
你真的需要单身吗
编辑:
然后,在UI中,您可以将特定区域与模型绑定,并使用$parent使用属于viewmodel的函数或属性:
define(['durandal/app', 'jquery'], function (app) {
var vm = function(){
var self = this;
this.title= 'Client Data';
this.canSubmit = ko.observable(false);
this.model = ko.validatedObservable({
personalNumber: ko.observable().extend({
required: true,
minLength: 11,
maxLength: 11
}),
documentNumber: ko.observable(),
documentType: ko.observable(),
country: ko.observable(),
firstName: ko.observable(),
middleName: ko.observable(),
lastName: ko.observable(),
citizenship: ko.observable(),
// .....
});
this.errors = ko.validation.group(this.model);
this.mustValidate = ko.observable(true);
//... add the properties
this.canSubmit = function(){
app.trigger('formIsValid:event', self.errors().length == 0);
return self.errors().length == 0;
}
//... add the methods
};
return vm;
};
不,这不是最好的解决办法。还有另一种方法可以做到这一点。我只需要解决singelton的问题。我认为这是实例化的问题。在durandal中,视图模型是单例的,但是如果您将viewmodel提供给合成,则可以初始化它们。但我认为您的情况没有必要使它变得更复杂。每次重新进入单例模块页面时,并不总是调用activate,即使您关闭了CacheView和transitions。这可能是一个错误,但在某些情况下它只是没有,我使用版本2.1不,这不是最好的解决方案。还有另一种方法可以做到这一点。我只需要解决singelton的问题。我认为这是实例化的问题。在durandal中,视图模型是单例的,但是如果您将viewmodel提供给合成,则可以初始化它们。但我认为您的情况没有必要使它变得更复杂。每次重新进入单例模块页面时,并不总是调用activate,即使您关闭了CacheView和transitions。它可能是一个bug,但在某些情况下它不是,我使用的是版本2.1我需要它是一个validatedObservable:var validationModel=ko.validatedObservable({self:this,title:'Client persona information',errors:ko.validation.group(self),mustValidate:ko.observable(true)}我不确定我是否理解,我想你是在混淆概念。viewModel可以包含一个validateObservable来表示你的模型。因此,当VM被实例化时,你的模型也将被创建,而不保留任何对以前激活的引用。请参阅编辑谢谢你的回答帮助我解决了问题。现在一切都正常了清楚:)我会投你的票,但我不能:Ddo你需要做任何事情来处理所有这些实例吗?我在我的案例中使用了单例,因为我一次只需要其中一个,我希望有一个重置功能,可以让durandal知道我每次都需要它来运行activate,而不仅仅是第一次。我想我必须创建一堆不必要的实例?那很好。。Durandal(和浏览器)将处理它们。只需确保其他长寿命对象不包含对viewmodel的任何引用。我认为在需要的时候应该使用单例:当您只需要并且只需要系统中一个对象的一个实例时。否则,请使用函数!viewmodels上的重置逻辑非常昂贵!我需要它是一个validatedObservable:var validationModel=ko.validatedObservable({self:this,title:'Client persona information',errors:ko.validation.group(self),mustValidate:ko.observable(true)}我不确定我是否理解,我想你是在混淆概念。viewModel可以包含一个validateObservable来表示你的模型。因此,当VM被实例化时,你的模型也将被创建,而不保留任何对以前激活的引用。请参阅编辑谢谢你的回答帮助我解决了问题。现在一切都正常了清楚:)我会投你的票,但我不能:Ddo你需要做任何事情来处理所有这些实例吗?我在我的案例中使用了单例,因为我一次只需要其中一个,我希望有一个重置功能,可以让durandal知道我每次都需要它来运行activate,而不仅仅是第一次。我想我必须创建一堆不必要的实例?那很好。。Durandal(和浏览器)将处理它们。只需确保其他长寿命对象不包含对viewmodel的任何引用。我认为在需要的时候应该使用单例:当您只需要并且只需要系统中一个对象的一个实例时。否则,请使用函数!viewmodels上的重置逻辑非常昂贵!