【问题标题】:knockout.js observablearray push not binding clickknockout.js observablearray 推送不绑定点击
【发布时间】:2015-07-28 14:57:38
【问题描述】:

我有一些html如下:

<table id="table">
    <thead>
        <tr>
            <th>Employee ID</th>
            <th>Name</th>
            <th>Role</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: Employees">        
        <tr>
            <td data-bind="text: Empid"></td>
            <td data-bind="text: Name"></td>
            <td data-bind="text: Role"></td>
            <td>
                <a data-bind="click: editEmployee">Edit</a>
            </td>
        </tr>            

    </tbody>
</table>

<div id="createForm">
    <input id="empidC" />
    <input id="nameC" />
    <input id="roleC" />
    <button type="button" id="insertEmployee">Create</button>
</div>

我有一个包含敲除代码的 javascript 文件:

    $('#insertEmployee').click(function () {

        var empidC = $("#empidC").val(),
            nameC = $("#nameC").val(),
            roleC = $("#roleC").val();

        $.ajax({
            type: "POST",
            url: "/Employees/Create",
            data: JSON.stringify({ "Empid": empidC, "Name": nameC, "Role": roleC }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {

                // Data gets inserted in DB and alert statement is executing
                alert(msg);              

                eList.Employees.push({
                    Empid:empidC,
                    Name:nameC,
                    Role:roleC
                });

            },
            error: function (xhr, status, error) {
                alert(xhr.responseText);
            }
        });

    });

    var getEmployees=function(){
        return $.get("/Employees/FetchEmployees");
    }

    //View Model for all Employees
    var EmployeeListVM = function () {
        var self = this;

        self.Employees = ko.observableArray();         

        getEmployees().done(function (data) {
            var emp = data.map(function (e) {
                return (new Employees(e));
            });
            self.Employees(emp);
        });

    };

    //Model for all Employees
    function Employees(data) {

        var self = this;

        this.Empid = ko.observable(data.Empid);
        this.Name = ko.observable(data.Name);
        this.Role = ko.observable(data.Role);

        this.editEmployee = function (record) {

            var eEdit = new SingleEmployee(record);

            var cont = document.getElementById("editForm");
            ko.cleanNode(cont);
            ko.applyBindings(eEdit, cont);

            $("#editForm").dialog({
                autoOpen: false,
                modal: true,
                width: 450,
                title: "Edit Selected Record(s)"                
            });

            $("#editForm").dialog("open");           

        };

    }

    // Viewmodel for editing single record
    function SingleEmployee(data) {

        var self = this;
        this.Empid = ko.observable(data.Empid);
        this.Name = ko.observable(data.Name);
        this.Role = ko.observable(data.Role);
    };

    var eList = new EmployeeListVM();
    ko.applyBindings(eList, document.getElementById("table"));

当我在 div "createForm" 中插入任何新记录时,我得到一个错误:

Uncaught ReferenceError: Unable to process binding "click: function (){return editEmployee }" 消息:editEmployee 未定义

新行正在显示,但该新插入记录的编辑链接不起作用

编辑:

我解决了这个问题。问题是“对象”被传递给员工(数据)而不是“员工”。所以在insertEmployee点击中,我把代码改成了:

            var newEmp = new Employees({
                Empid: empidC,
                Name: nameC,
                Role: roleC
            });

            eList.Employees.push(newEmp);

【问题讨论】:

  • 我不确定发生了什么,但您不应该在绑定处理程序之外摆弄 DOM。
  • @RoyJ 我没听懂你
  • 您处理点击绑定和 jQuery 对话框的方式表明存在问题。 Knockout 有一个click 绑定,您应该为对话框创建一个自定义绑定。不过,我不知道这是否与您遇到的错误有关。

标签: javascript jquery html knockout.js


【解决方案1】:

数据是否真正到达您的服务器端控制器并更新数据库?用于发布数据并在服务器上调用 Create 方法的 ajax 调用,在 Success 部分假定服务器上一切正常。这里所有的成功路径都是说客户端调用没问题,这不是服务器成功。如果您当前有警报语句,则需要确保服务器端实际发布了数据,然后再尝试稍后在页面刷新时检索它。

【讨论】:

  • 数据将进入控制器并在数据库中更新,并且正在执行警报语句
  • 声明 this.Empid = ko.observable(data.Empid); 的 2 个函数等,将它们移到主代码块上。您应该只需要将这些声明为可观察一次,然后淘汰赛应该跟踪
  • 感谢您的帮助,但我已经编辑了问题并指定了问题及其解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
相关资源
最近更新 更多