我有一个带热毛巾的 SPA(Breeze 1.4.5、Durandal 2.0.1、Knockout 3.0.0、Bootstrap 3.0、jquery 2.0.3),我在客户端视图中使用 ko.extenders 进行了验证,并且一切正常,但是当我扩展一个 observable 时(导航属性)与 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
并name
没有显示。
我设置了断点来验证validationMessage
andhasError
的值viewmodel
,它具有正确的值,但在视图中没有显示validationMessages
。
在 html 视图中添加此行以验证验证状态后:
<span data-bind="visible: name.hasError, text: 'Has Error'"></span>
<span data-bind="visible: !name.hasError(), text: 'No has Error'"></span>
我测试了 de SPA,稍后使用按钮添加新操作,addAction
视图显示两次重复的输入 html 控件,然后我在一个输入中输入一个值,name
验证消息出现但仅在一个输入 html 控件中,在第二个输入 html 控件中(重复)验证消息没有出现。
下一行导致“输入html控件”的两次重复:
<span data-bind="visible: !name.hasError(), text: 'No has Error'"></span>
该视图不会在来自微风实体的导航属性项中使用 ko.extenders 刷新验证消息。
我已经再次测试了所有内容,但我没有使用 Breeze 创建实体,只是我使用了简单的对象并且所有工作都完美......但我真的需要使用 Breeze 来创建实体。