2015-04-17 1 views
4

У меня есть сценарий Knockout.Validation, который, я думаю, будет довольно распространенным явлением, но не нашел решения для поиска по сети и различных ответов на этом сайте ,Knockout.Validation не показывает сообщения об ошибках для свойства, загружаемого после первоначальной рендеринга

Свойство, которое я проверяю, не добавляется к нокауту, наблюдаемому до тех пор, пока после вызова ajax. Когда валидация запускается, проверка не выполняется и является ошибкой в ​​моей группе проверки, но сообщение об ошибке не отображается на странице. Я убедился, что все проверки подключены путем добавления проверки на свойство, которое существует, когда происходит первоначальный визуализатор, и сообщение показывает это.

Я знаю, что могу установить значение по умолчанию для свойства, но я бы не ожидал, что вам придется это сделать. Когда я вручную добавляю сообщение проверки с свойством validateMessage databind, он выдает ошибку js, потому что свойство не существует, когда нокаут выполняет свой первый проход через ..... Uncaught TypeError: не удается обработать привязку "validationMessage: function() { return BlogPost(). Заголовок} " Сообщение: Не удается прочитать свойство 'extend' неопределенного.

См. Этот плунж для примера ... http://plnkr.co/edit/OhUw8wP2uNypulbcOIbz?p=preview.

self.Errors = ko.validation.group(this, { deep: true }); 
    self.Count(self.Errors().length); 
    if (self.Errors().length === 0) { 
     alert("no errors"); 
    } 
    else { 
     self.Errors.showAllMessages(); 
    } 

Он использует require js, но это не вызывает никаких проблем, как для стандартного сценария, которое показывает сообщение проверки.

Что мне здесь не хватает, чтобы получить эту работу?

ответ

2

Это довольно чисто ... перемещайте свои наблюдаемые до основной модели просмотра и оставляйте updateBlogPost просто методом (никаких свойств ... как и должно быть).

Это позволяет вам вызвать self.Errors.showAllMessages() после загрузки сообщения в блоге. Не знаете, вам нужен метод обновления после этого изменения?

function EditBlogPostViewModel(params) { 

    var self = this; 
    self.BlogPost = ko.observable({}); 
    self.ErrorsCount = ko.observable(0); 

    self.Test = ko.observable("").extend({ required: true }); 
    self.Count = ko.observable(0); 
    self.Errors = ko.validation.group(this, { deep: true }); 
    self.Count(self.Errors().length); 

    blogApiService.getCategories().then(function (categories) { 
     return blogApiService.getBlogPost(params.id).then(function (post) { 
      self.BlogPost(new BlogPost(post, categories)); 
      self.Errors.showAllMessages(); 
     }); 
    }); 

} 

EditBlogPostViewModel.prototype.updateBlogPost = function() { 
    var self = this; 
    if (self.Errors().length === 0) { 
     alert("no errors"); 
    } 
    else { 
     self.Errors.showAllMessages(); 
    } 
}; 
+0

... решение проблемы по вашему решению? –

+0

Решение не найдено. то, что вы предложили выше, не устраняет проблему. ko.validation.group не является наблюдаемым, поэтому, когда установлен параметр BlogPost, проверяемый, группа проверки не обновляется. Возможно, я не объяснил проблему должным образом. Он теперь более заметен в обновленном плунге, поскольку я установил одно из свойств наблюдаемого объекта BlogPost как пустую строку. Поэтому при попытке обновления сообщение об ошибке показывает наблюдаемое с проверкой на верхнем уровне, называемом Test, которое устанавливается на раннем этапе, но не свойство TitlePable для наблюдаемого объекта BlogPost. – JohnG

+0

@BrettGreen +1 из-за иллюстрации "ko.validation.group (это, {deep: true});" Я не знал о глубоком варианте, и это не позволяло мне сообщать об ошибках. Где это документировано? Я не могу найти его в Wiki или в другом месте. –

1

установить глубоки верно в self.errors собственности,

self.errors = ko.validation.group(self, { deep: true }); 

и установить для отображения сообщений об ошибках,

ViewModel.errors.showAllMessages(true);   

Надеется, что это работает!

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