【问题标题】:Hot Towel SPA Modal Dialog knockout bindings and validationHot Towel SPA Modal Dialog 敲除绑定和验证
【发布时间】:2013-06-11 20:00:43
【问题描述】:

我正在使用 Hot Towel SPA 模板构建 SPA。
这是我的问题:
我有一个视图,我在其中放置与场地相关的信息(名称、描述、地址等) 与场地相关的是不同的房间,它们有自己的字段(名称、描述、类型等) 我有一个房间列表和一个“添加新房间”按钮。
当我点击按钮时,会弹出一个模式对话框,我用请求的信息填写表格,然后保存。对话框关闭后,列表会更新。 我能够从对话框中检索信息,但如果字段留空,我将无法触发验证规则。
datacontext.HasChanges() 也总是返回 true。 是否可以像使用任何其他视图一样使用模态对话框?
这是我正在使用的部分代码:
来自 Model.cs

public class Venue
{
    [Key]
    public int VenueId { get; set; }
    [Required(ErrorMessage = "Venue Name is required.")]
    [Display(Name = "Venue Name")]
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Room> Fields { get; set; }
    ...
}

public class Room
{
    [Key]
    public int RoomId { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    [Display(Name = "Name")]
    public string Name { get; set; }
    public string Description { get; set; }
    public string Notes { get; set; }

    public int VenueId { get; set; }
    public virtual Venue Venue { get; set; }
    ...
}

来自 venuedetail.js

define(['services/datacontext',
    'services/model',
    'durandal/plugins/router',
    'durandal/system',
    'durandal/app',
    'services/logger',
    'viewmodels/roommodal'],
function (datacontext, model, router, system, app, logger, roommodal) {
    ...
    var addRoom = function () {
        var newRoom= datacontext.manager.createEntity("Room");
        roommodal.room = newRoom;
        app.showModal(roommodal).then(function (response) {
            if (response) {

            }
            return true;
        });
    };
    ...

来自 roommodal.js:

define(['durandal/app', 'services/datacontext', 'durandal/system',     'durandal/plugins/router', 'services/logger'],
function (app, datacontext, system, router, logger) {
    var isSaving = ko.observable(false);
    var room= ko.observable();
    activate = function(routeData) {
        return true;
    };
hasChanges = ko.computed(function() {
    return datacontext.hasChanges(); // Always true ?
});
canSave = ko.computed(function() {
    return hasChanges() && !isSaving();
});

canDeactivate = function () {
    return true;
};

var save = function(dialogResult) {
    this.modal.close(dialogResult);
    };

    var cancel = function() {
        this.modal.close(false);
    };

var vm = {
    activate: activate,
    save: save,
    canSave: canSave,
    cancel: cancel,
    canDeactivate: canDeactivate,
    room: room,
    hasChanges: hasChanges,
    title: 'Add room'
};

return vm;

来自 roommodal.html

<div class="messageBox">
<div class="modal-header">
    <h3 data-bind="text: title"></h3>
    <i class="icon-asterisk" data-bind="visible: hasChanges"></i>
</div>
<div class="modal-body">
    <div data-bind="with: room">
        <label for="name">Name</label>
        <input id="name" data-bind="value: name, valueUpdate: 'afterkeydown'"
            placeholder="Enter name" />
        <div>
            <label>Description</label>
            <textarea data-bind="value: description"
                placeholder="Enter description"></textarea>
        </div>
        <div>
            <label>Notes</label>
            <textarea data-bind="value: notes"
                placeholder="Enter notes"></textarea>
        </div>
    </div>
</div>
<div class="modal-footer">
    <button class="btn btn-info"
        data-bind="click: cancel, enable: canSave">
        <i class="icon-undo"></i>Cancel</button>
    <button class="btn btn-info"
        data-bind="click: save, enable: canSave">
        <i class="icon-save"></i>Save</button>
</div>

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

    标签: durandal hottowel


    【解决方案1】:

    当您尝试使用 datacontext.saveChanges() 保存时触发验证,而您在这段代码中没有这样做,相反,您只是关闭了模式窗口。

    查看保存是否成功的最简单方法是事后检查HasChanges - 如果一切顺利,则为假,否则为真。

    datacontext.HasChanges() 在您进入模态窗口时返回 true,因为您在打开模态窗口之前创建了一个实体并将其放置在您的上下文中。在关闭模态窗口之前,您只能忽略 HasChanges 并静默 CancelChanges

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2013-04-17
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      相关资源
      最近更新 更多