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上的重置逻辑非常昂贵!