0

ホットタオル 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後で確認することです。すべてがうまくいった場合は false であり、そうでない場合は true になります。

datacontext.HasChanges()エンティティを作成し、モーダル ウィンドウを開く前にコンテキストに配置するため、モーダル ウィンドウに入ると true を返します。モーダル ウィンドウを閉じる前にHasChanges、黙って無視することしかできません。CancelChanges

于 2013-08-07T11:38:27.803 に答える