【问题标题】:Having trouble rendering KO template data with button added via JavaScript使用通过 JavaScript 添加的按钮呈现 KO 模板数据时遇到问题
【发布时间】:2013-08-16 22:38:22
【问题描述】:

如果标题有误导性,我提前道歉。我整天都在处理这个问题,我想看看是否有人可以提供帮助。

概述: 我们所有的模板都预先加载到 DOM 中。以前,所有表单(模板)都设计为显示在现有页面上。但是,我们最近将所有模板移动到 jQueryUI 对话框中显示。我已经成功地移动了所有必要的代码以使其工作,但一个模板除外,我相信这是因为在进行搜索后,打开带有模板的 jQueryUI 对话框的按钮已加载到 DOM 中。

“添加”按钮调用 ViewModel 中的“addUos”函数,以便用户可以根据需要继续添加任意数量的表单。

HTML

模板:(使用 TWIG 作为模板引擎)

<script type="text/html" id="adduos-form">
    {% include "sections/adduos.html" %}
</script>

jQueryUi 对话框:

<div id="addUosDialog" title="Add UOS (Units of Service)">
<div id="addUosDialogDiv">
    <div id="adduos_block">
        <form id="adduosForm" action="" method="">
            <div id="addUosDiv">
                <!-- Populated by Ajax via clientTabs.js -->
            </div>
        </form>
    </div>
</div>

JavaScript:

此代码创建模板将在其中呈现的 div

var currDialogDiv = $("#addUosDiv");
var currDialogForm = $("<div id='addUosForm' data-bind=\"" + "template: { name:'adduos-form', foreach: uos_data }\"></div>");

//Create Template
$(currDialogDiv).append(currDialogForm);

此代码位于 for 循环中,并在基本网格中创建所有用户条目。为每个条目创建一个添加和编辑按钮。编辑按钮工作得很好,但添加按钮会根据需要打开对话框,但不会显示模板。在使用 Chrome 开发工具进行测试后,VM 中的 addUos 函数在单击时不会被触发。 (这是我的主要问题)

$(currTR).append("<td class='bodyId'>" + currRegNo + "</td>"); //TODO: This will be removed in the future
$(currTR).append("<td>" + currLastName + "</td>");
$(currTR).append("<td>" + currFirstName + "</td>");
$(currTR).append("<td>" + currDob + "</td>");
$(currTR).append("<td>" + currType + "</td>");
$(currTR).append("<td><a href='javascript:;' data-bind='click: $root.addUos' onclick='openAddUosDialog(" + currRegId + ", \"" + currFirstName + "\", \"" + currLastName + "\")' class='button blue small'>Add</a><a href='javascript:;' onclick='openEditUosDialog(" + currRegId + ")' class='button blue small'>Edit</a></td>");

然后我将绑定应用到特定元素

ko.applyBindings(viewModelObj.clientsUosVM, document.getElementById("addUosForm"));

ViewModelObj:(我目前有 2 个独立的虚拟机)

viewModelObj = {

    clientsVM : new clientsVM(),
    clientsUosVM : new clientsUosVM()
};

ko.applyBindings(viewModelObj.clientsVM);
clientsUosVM = new clientsUosVM();

视图模型:

function clientsUosVM() {

var self = this;
var uCount = 0; //UOS Forms

self.uos_data = ko.observableArray();

self.addUos = function() {

    self.uos_data.push({
        uosloc : 'uos[' + uCount + '][uosloc]',
        uosloc_id : 'uosloc_' + uCount,

        uossrv : 'uos[' + uCount + '][uossrv]',
        uossrv_id : 'uossrv_' + uCount,

        uosnum : 'uos[' + uCount + '][uosnum]',
        uosnum_id : 'uosnum_' + uCount,

        uosbegin : 'uos[' + uCount + '][uosbegin]',
        uosbegin_id : 'uosbegin_' + uCount,

        uosexp : 'uos[' + uCount + '][uosexp]',
        uosexp_id : 'uosexp_' + uCount
    });

    populateLoc($('select#uosloc_' + uCount));
    $('input#uosbegin_' + uCount).mask('99/99/2099');
    $('input#uosexp_' + uCount).mask('99/99/2099');
    uCount++;
};

self.removeUos = function(item) {

    self.uos_data.remove(item);
};

self.dumpUos = function() {

    self.uos_data([]);
};
}

我包含了我会考虑的所有代码,但如果您需要任何其他信息或代码,请告诉我。提前谢谢!

【问题讨论】:

    标签: javascript knockout.js twig knockout-2.0 knockout-mvc


    【解决方案1】:

    感谢花时间阅读我的长问题的人,但我昨天在下班前发现了我的问题。

    我刚刚删除了数据绑定点击事件data-bind='click: $root.addUos并将其移至onclick函数'openAddUosDialog()'

    希望这可以帮助遇到类似问题的其他人。

    //Open Add UOS Dialog
    function openAddUosDialog(regid, fname, lname) {
    
    viewModelObj.clientsUosVM.dumpUos();
    viewModelObj.clientsUosVM.addUos();
    $("#adduos_block").show(200);
    
    //Open Dialog
    $("#addUosDialog").dialog("open");
    
    $("#auos_regid").val(regid);
    $("#auos_fname").val(fname);
    $("#auos_lname").val(lname);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2016-01-13
      • 2021-08-08
      • 1970-01-01
      相关资源
      最近更新 更多