淘汰赛绑定不会清除/删除

时间:2015-12-09 18:03:11

标签: jquery asp.net-mvc knockout.js

我在MVC视图上定义了一个bootstrap模式,见下文。

<div id="myOpenRequestModal" class="modal fade" role="dialog">
<div class="modal-dialog" style="overflow-y: initial !important;">

    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">&times;</button>
            <h4 class="modal-title">TSR Preview Summary</h4>
        </div>
        <div class="modal-body" style="max-height:800px;overflow-y:auto;">

        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-warning btn-override" style="display:none;">Override</button>
            <button type="button" class="btn btn-warning btn-override-commit" style="display:none;">Commit Override</button>
            <button type="button" class="btn btn-warning btn-override-cancel" style="display:none;">Cancel Override</button>
            <button type="button" class="btn btn-info tsrcancel" data-dismiss="modal">Cancel Request</button>
            <button type="button" class="btn btn-info close-request" data-dismiss="modal">Close Request</button>
            <button type="button" class="btn btn-default print-button">Print</button>
            <button type="button" class="btn btn-default" data-dismiss="modal">Exit</button>
        </div>
    </div>
</div>

当用户点击&#34;查看&#34;在网格上的按钮,它执行Ajax调用以获取渲染局部视图的html,返回它并填充模态的主体jquery,例如$('modalbody').html(htmlreturned);。在这个阶段,挖掘出现在部分视图的部分上,绑定被调用一次,见下文......

    <div class="row">
    <div class="col-md-2 left-padding-row">
        Note(s):
    </div>
    <br />
    <div class="col-md-10 left-padding-row">
        <table class="table notes" style="margin-bottom:0 !important;">
            <tbody id="NotesGrid" data-bind="foreach:{data: Notes, as: 'note'}">
                <tr data-bind="attr: { index: $index }">
                    <td width="70%">
                        <textarea data-bind="value: note.Value, disable: note.Disabled, attr: { name: 'Notes[' + $index() + '].Value'}" style="width:100%;height:100%;resize: none;"></textarea>
                    </td>
                    <td width="25%">
                        <input class="btnRemove" type="button" data-bind="click: $parent.removeNote, visible: note.IsNew" value="Remove" />
                    </td>
                    <td width="5%">
                        <input class="hdnNoteID" type="hidden" data-bind="value: note.NoteID" />
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>


var _viewModel = new ViewModel();

function note(index) {
    this.NoteID = ko.observable('');
    this.Value = ko.observable('');
    this.Index = ko.observable(index);
    this.IsNew = ko.observable(true);
    this.ShowID = ko.observable(false);
    this.Disabled = ko.observable(false);
    return this;
};

function ViewModel() {
    var self = this;

    self.Notes = ko.observableArray(convertJSONToKoObservableObject());

    //Ko Functions
    self.addNote = function () {
        var index = $('#NotesGrid tr:last').attr('index');
        self.Notes.push(new note(index + 1));
    }

    self.removeNote = function (row) {
        self.Notes.remove(row);
    }
}

//FUNCTION
function convertJSONToKoObservableObject() {
    var json = JSON.parse('@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model.Submission.Notes))');
    var ret = [];
    var index = 0;
    $.each(json, function (i, obj) {
        var newOBJ = new note(index);
        newOBJ.NoteID = ko.observable(obj["NoteID"]);
        newOBJ.Value = ko.observable(obj["Value"]);
        newOBJ.Index = ko.observable(index);
        newOBJ.IsNew = ko.observable(false);
        newOBJ.Disabled = ko.observable(true);
        newOBJ.ShowID = ko.observable(false);
        ret.push(newOBJ);
        index++;
    });

    return ret;
}

//BIND UP! *UPDATED*
ko.applyBindings(_viewModel, $('.notes')[0]);

以上是创建网格并对其应用knockout的代码。这一切都是在模态的第一次加载时返回的部分视图html。如果我关闭模态然后重新打开相同的局部视图,它就会爆炸,因为绑定已经存在。我尝试了ko.cleanNodedestroyremove等。有人可以请教我如何在这种情况下正确重新绑定吗?

编辑:为了澄清,1 MVC视图包含模态标记和1 MVC部分视图用于渲染模态的主体。淘汰代码存在于局部视图中。

1 个答案:

答案 0 :(得分:1)

问题的主要来源是通过AJAX加载的局部视图中的KO绑定定义是将视图模型全局绑定到容器。

这里的一个好解决方案(即使您不想重新加载局部视图)是使用此语法在部分视图中将绑定本地化为容器元素

ko.applyBindings(_viewModel,$("#inpartialview")[0]);

这将使用id&#34; inpartialview&#34;绑定元素。查看模型,如果需要可以很容易地隔离替换,最终消除了进行任何绑定清理工作的需要。