【发布时间】: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