我有一个带有hottowel的SPA(Breeze 1.4.5,Durandal 2.0.1,Knockout 3.0.0,Bootstrap 3.0,jquery 2.0.3),我在客户端视图中使用ko.extenders进行了验证,所有工作都很完美,但是当我使用ko.extenders扩展可观察的(导航属性),验证不起作用,但错误消息未在视图中显示。我有下一堂课:
public class Animal
{
public Animal()
{
Actions = new List<Action>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Action> Actions { get; set; }
}
public class Action
{
public int Id { get; set; }
public int AnimalId { get; set; }
[Required]
public int ActionTypeId { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
}
观点:
<div data-bind="with: animal">
<input data-bind="value: name"/>
<div data-bind="foreach: actions">
<div>
<p data-bind="css: { errorMessageForm: name.hasError }">
<input type="text" data-bind="value: name, valueUpdate: 'afterkeydown'" maxlength="128" />
<span data-bind="visible: name.hasError, text: name.validationMessage"></span>
<span data-bind="visible: name.hasError, text: 'Has Error'"></span>
<span data-bind="visible: !name.hasError(), text: 'No Has Error'"></span>
</p>
</div>
<div>
<p data-bind="css: { errorMessageForm: description.hasError }">
<input type="text" data-bind="value: description, valueUpdate: 'afterkeydown'" maxlength="128" />
<span data-bind="visible: description.hasError, text: description.validationMessage"></span>
</p>
</div>
<div>
<p data-bind="css: { errorMessageForm: actionTypeId.hasError }">
<select data-bind="options: $root.actionTypes, optionsText: 'name', optionsValue: 'id', value: actionTypeId, valueUpdate: 'change'"></select>
<span data-bind="visible: actionTypeId.hasError, text: actionTypeId.validationMessage"></span>
</p>
</div>
</div>
<button data-bind="click: $root.addAction"><span>Add Action</span></button>
addAction
的代码:
addAction = function () {
var action = datacontext.createAction();
//add validators
action.actionTypeId.extend({ intRequired: 'The action type is required' });
action.name.extend({ required: 'The name is required' });
}
createAction
的代码:
function createAction() {
var initialValues = {
animalId: getCurrentAnimalId()
};
var action = manager.createEntity(entityNames.action, initialValues);
return action;
}
要验证的扩展程序在页面Using extenders to augment observables中是相同的。
财产validationMessage
和actionTypeId
的{{1}}未显示。
我使用断点来验证name
中validationMessage
和hasError
的值,并且它具有正确的值,但在视图中没有显示viewmodel
。
我在html视图中添加了这些行以验证验证状态:
validationMessages
我有测试de SPA,稍后使用按钮<span data-bind="visible: name.hasError, text: 'Has Error'"></span>
<span data-bind="visible: !name.hasError(), text: 'No has Error'"></span>
添加新操作视图显示两次重复的输入html控件,然后我在一个输入addAction
中输入一个值并显示验证消息但仅在一个输入html控件中,在第二个输入html控件(重复)中没有出现验证消息。
下一行导致两次重复的“输入html控件”:
name
视图不会使用breeze实体的导航属性项中的ko.extenders刷新验证消息。
我再次测试了所有,但我没有使用Breeze创建实体,只有我使用了简单的对象并且所有工作都完美...但我真的需要使用Breeze来创建实体。