2013-12-09 2 views
1
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; 
    }, 
}; 

Когда я перемещаюсь от этой композиции, он по-прежнему хранит данные на входах. Как я могу сделать наблюдаемые не вспомнить значения после того, как уйдет, так что, когда я снова запустить эту композицию будет ясноDurandal Singletone Issue

ответ

2

Просто вернуть функцию конструктора вместо объекта в функции определения ViewModel (модуль).

define(['durandal/app', 'jquery'], function (app) { 
    var vm = function(){ 
     var self = this; 
     this.title= 'Client Data'; 
     this.canSubmit = ko.observable(false); 
     //... properties 
     this.canSubmit = function(){ 
      app.trigger('formIsValid:event', self.errors().length == 0); 
      return self.errors().length == 0; 
     } 
     //... methods 
    }; 

    return vm; 
}; 

Таким образом, при каждом включении режима просмотра создается новый экземпляр. Если вам нужны синглтоны по какой-то причине, тогда вы должны добавить дополнительную логику в деактивацию, чтобы очистить значения.

Вам действительно нужен синглтон?

EDIT:

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, используя $ родителя:

<form data-bind="with: model"> 
     <input data-bind="value: personalNumber" type="text"/> 
     <button data-bind="click: $parent.submit, visible: $parent.canSubmit() /> 
    </form> 

В основном, просто примените MVVM, model-view - ViewModel. То, что вы пытаетесь сделать, это создать супер-модель, которая также ведет себя как ViewModel.

+0

спасибо за ваш ответ, но я забыл немного деталей. –

+0

мне нужно быть validatedObservable: вар validationModel = ko.validatedObservable ({ самостоятельно: это, название: 'Клиент информация персонами', ошибки: ko.validation.group (Я), mustValidate: Ко. наблюдаемый (true) } –

+0

Я не уверен, понял ли я, я думаю, что вы смешиваете понятия. ViewModel может содержать validateObservable, который может представлять вашу модель. Поэтому, когда виртуальная машина создается, ваша модель также будет создана , не проводя никаких ссылок на предыдущую активацию. См. edit – margabit

-1

Вы можете использовать событие реактивировать, чтобы установить начальные значения,

activate: function() { 
this.phone(""); 
this.citizenship(""); 
//.... 
}, 

Редактировать
Другой вариант заключается вручную инстанцировании вашу модель представления,

define(['durandal/app', 'jquery'], function (app) { 
    var ctor=function(){ 
    this.phone(""); 
    //... 
    } 

    return ctor; 
}); 

в модели родительского вида экземпляр новой модели,

activate:function{ 
     this.myViewModel=new myViewModel(); 
    } 

А затем в HTML указать экземпляр вид модели

data-bind="compose: { model:myViewModel, view:'myView.html' }" 
+0

Нет, это не лучшее решение. Есть и другой способ сделать это. Мне просто нужно исправить проблему, связанную с singelton. Я думаю, что это проблема при создании экземпляра. –

+0

В durandal модели просмотра являются одиночными, но вы можете инициировать их, если вы даете viewmodel композиции. Но я не вижу в вашем случае смысла, чтобы сделать его более сложным. –

+0

Активация не всегда вызывается каждый раз, когда вы повторно вводите страницу модуля singleton, даже если вы отключите кеширование и переходы. это может быть ошибка, но в некоторых сценариях это просто не так, im, используя версию 2.1 – pilavdzice

Смежные вопросы