0

我正在使用 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; }
    ...
}

来自场地详情.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>

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

4

1 回答 1

1

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

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

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

于 2013-08-07T11:38:27.803 回答