【问题标题】:When should I bind events to elements generated by Knockout binding?我应该何时将事件绑定到由 Knockout 绑定生成的元素?
【发布时间】:2012-10-04 12:57:12
【问题描述】:

我正在使用以下标记(删节)在表格中显示人员对象列表。我想在单击某行时打开一个“编辑详细信息”弹出窗口,但我的基本事件绑定不适用于通过 Knockout 数据绑定添加到表中的行。

<script>
    function PersonModel(data) {
        var self = this;
        self.id = data.Id;
        self.firstName = data.FirstName;
    }
    $(function () {
        function personListModel() {
            var self = this;
            self.persons = ko.observableArray([]);
            $.getJSON("Person/IndexJson", function (allData) {
                var mappedPersons = $.map(allData, function (item) { return new PersonModel(item); });
                self.persons(mappedPersons);
            });
        }
        ko.applyBindings(new personListModel());
        $(".person-row").click(function () {
            alert("Hello ");
        });
    });
</script>
<table>
    <tbody data-bind="foreach: persons">
        <tr class="person-row" data-bind="attr: { 'data-id': id }">
            <td data-bind="text: firstName"></td>
            <td data-bind="text: surname"></td>
            <td data-bind="text: email"></td>
            <td data-bind="text: cell"></td>
        </tr>
    </tbody>
</table>

如果我在页面呈现并绑定后从 JS 控制台绑定单击事件处理程序,则该处理程序被正确调用,但上面代码中的初始事件绑定根本不起作用。我必须做什么才能绑定到由淘汰赛生成的行。我认为在ko.applyBindings() 之后绑定事件处理程序就足够了。

【问题讨论】:

    标签: jquery web-applications knockout.js knockout-2.0


    【解决方案1】:

    您需要使用 JQuery 的 on method 订阅页面加载后添加的 DOM 元素上的事件:

    $(".person-row").on("click", function(event){
        alert("Hello ");
    });
    

    或者您可以使用click binding 结构并通过敲除处理订阅:

    function personListModel() {
        var self = this;
                ...
    
        self.personClicked = function(data) {
            alert("Hello ");
        }
    }
    

    在你看来:

    <tr class="person-row" data-bind="attr: { 'data-id': id }, click: $root.personClicked">
    

    您可以在 fiddle 中看到它的实际效果。

    【讨论】:

    • 您可以将参数添加到您的 personClicked 函数 self.personClicked: function(data, event) { } 其中 data 将是点击的 PersonModelevent 将是点击事件参数,有关更多信息,请参阅 click binding documentation
    • 你是对的,绑定事件的正确语法是click: $root.personClicked 我已经更新了我的答案并创建了一个工作小提琴。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 2016-03-15
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多