在breeze实体中使用ko.extenders / navigation属性查看无刷新验证消息

时间:2013-06-29 05:12:31

标签: knockout.js breeze durandal hottowel

我有一个带有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中是相同的。

财产validationMessageactionTypeId的{​​{1}}未显示。

我使用断点来验证namevalidationMessagehasError的值,并且它具有正确的值,但在视图中没有显示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来创建实体。

0 个答案:

没有答案