Как выполнить проверку Knockout на сложных моделях MVC декларативным способом?

Технически у меня есть ответ на этот вопрос, но, к сожалению, не тот, который я искал. Мне пришлось принять это, потому что этот человек работал со мной все время, вкладывая много усилий. Здесь я прошу того же q-n получить конкретный ответ, который мне нужен:

Мне нужен декларативный способ выражения проверок полей модели в модели представления Knockout:

Имея эту модель представления MVC:

public class Email
{
  public string Selected { get; set; }
  public string Name { get; set; }
}

public class User
{
  public string UserName { get; set; }
  public IList<Email> Emails { get; set; }
}

и имеющий этот нокаут viewModel:

var viewModel = {
  UserName: ko.observable("@Model.UserName"),
  Emails: ko.observableArray(@Html.Json(@Model.Emails) || []),

  // How to express these: ???
  // Email.Selected: ko.observable().extend({ required: true })
  // Email.Name: ko.observable().extend({ required: true, email: true })

}

какие изменения мне нужно внести в Knockout viewModel, чтобы декларативно выразить это. По сути, это сводится к выражению Knockout viewModel аналогично MVC, но с использованием проверки нокаута (вместо аннотаций данных MVC) в полях этой модели.

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


person Display Name    schedule 12.03.2013    source источник


Ответы (1)


У меня была бы модель просмотра электронной почты,

var Email = 
{
    Selected: ko.observable().extend({ required: true }),
    Name: ko.observable().extend({ required: true, email: true })
}

а затем используйте подключаемый модуль сопоставления, чтобы автоматически заполнить его для вас:

var viewModel = function()
{
    var self = this;
    self.UserName: ko.observable("@Model.UserName");
    var mapping = {
    'Emails': {
        create: function(options) {
            return new Email(options.data);
        }
     }
     self.Emails= ko.mapping.fromJSON(@Html.Json(@Model.Emails), mapping);
}

Обратите внимание, что я думаю, что вам нужно сделать вашу модель представления функцией, а не прямым объектом JS, поскольку я не думаю, что в противном случае это будет работать.

person Paul Manzotti    schedule 12.03.2013
comment
Спасибо, Пол, я приму твой ответ и постараюсь встроить его. Вернусь. Определенно выглядит многообещающе. Спасибо. - person Display Name; 12.03.2013