gpt4 book ai didi

javascript - Knockout - 将单击绑定(bind)到嵌套数组子元素

转载 作者:行者123 更新时间:2023-11-28 20:46:22 25 4
gpt4 key购买 nike

好吧,我在使用 Knockout 时遇到问题,因为它无法解析可观察数组的子元素上的单击绑定(bind)。我怀疑我的映射有问题,但我无法弄清楚。我创建了一个 jsFiddle:

http://jsfiddle.net/internetH3ro/ShjeE/1/

这是我的 JS:

var PaycheckBudgetItem = function(data) {
var self = this;
self.PaycheckBudgetItemId = ko.observable(data.PaycheckBudgetItemId);
self.PaycheckBudgetId = ko.observable(data.PaycheckBudgetId);
self.Description = ko.observable(data.Description);
self.Amount = ko.observable(data.Amount);
self.DueDate = ko.observable(data.DueDate);
self.IsPaid = ko.observable(data.IsPaid);
self.PaidStatus = ko.observable(data.PaidStatus);

self.updateStatus = function() {
alert('test');
};
};

var mapping = {
'Items': {
create: function(options) {
return new PaycheckBudgetItem(options.data);
}
}
};

var PaycheckBudget = function(data) {
var self = this;
self.PaycheckBudgetId = ko.observable(data.PaycheckBudgetId);
self.PaycheckBudgetDate = ko.observable(data.PaycheckBudgetDate);
self.PaycheckBudgetAmount = ko.observable(data.PaycheckBudgetAmount);
self.Remaining = ko.observable(data.Remaining);
self.Items = ko.observableArray(data.Items);
ko.mapping.fromJSON(data.Items, mapping, self.Items);
};

var BudgetListViewModel = function(data) {
var self = this;
self.budgets = ko.observableArray(data);
};

var data = [
{
"PaycheckBudgetId": 1,
"PaycheckBudgetDate": "11/9/2012",
"PaycheckBudgetAmount": 2315,
"Items": [
{
"PaycheckBudgetItemId": 11,
"PaycheckBudgetId": 1,
"Description": "Rent",
"Amount": 400,
"DueDate": "11/9/2012",
"IsPaid": "Unpaid",
"PaidStatus": false},
{
"PaycheckBudgetItemId": 12,
"PaycheckBudgetId": 1,
"Description": "Cell Phone",
"Amount": 166,
"DueDate": "11/9/2012",
"IsPaid": "Unpaid",
"PaidStatus": false}
],
"Remaining": 1749},
{
"PaycheckBudgetId": 2,
"PaycheckBudgetDate": "11/23/2012",
"PaycheckBudgetAmount": 2315,
"Items": [
{
"PaycheckBudgetItemId": 3,
"PaycheckBudgetId": 2,
"Description": "Rent",
"Amount": 400,
"DueDate": "11/23/2012",
"IsPaid": "Unpaid",
"PaidStatus": false},
{
"PaycheckBudgetItemId": 4,
"PaycheckBudgetId": 2,
"Description": "Tuition",
"Amount": 250,
"DueDate": "11/23/2012",
"IsPaid": "Unpaid",
"PaidStatus": false}
],
"Remaining": 1665}
];

ko.applyBindings(new BudgetListViewModel(data), $('#budget-list-container')[0]);​

这是我的 HTML:

<div id="budget-list-container" class="well sidebar-nav">
<ul class="nav nav-list" data-bind="template: { name: 'budgetTemplate', foreach: budgets, as: 'budget' }">
<script type="text/html" id="budgetTemplate">
<li class="nav-header">
Paycheck for <span data-bind="text: PaycheckBudgetDate"></span> - <span data-bind="text: formatCurrency(PaycheckBudgetAmount)"></span>
</li>
<li>
<table class="table table-bordered table-condensed">
<thead>
<tr>
<th>Description</th>
<th>Amount</th>
<th>Due Date</th>
<th>Paid/Unpaid</th>
</tr>
</thead>
<tbody data-bind="template: { name: 'budgetItemTemplate', foreach: Items, as: 'budgetItem' }"></tbody>
</table>
Remaining: <span data-bind="text: formatCurrency(Remaining)"></span>
<hr />
</li>
</script>
<script type="text/html" id="budgetItemTemplate">
<tr>
<td><span data-bind="text: Description"></span></td>
<td><span data-bind="text: formatCurrency(Amount)"></span></td>
<td><span data-bind="text: DueDate"></span></td>
<td>
<button class="btn-link pull-right update-status" data-bind="text: IsPaid, click: updateStatus" />
</td>
</tr>
</script>
</ul>
</div>​

重点是这个。我有 2 个 KO 模型,PaycheckBudget 和 PaycheckBudgetItem。 PaycheckBudget 包含 PaycheckBudgetItem 模型的可观察数组。 PaycheckBudgetItem 模型上有一个名为“updateStatus”的函数,它绑定(bind)到我的 HTML 中的单击事件。当我加载页面时,出现错误“无法解析绑定(bind)。updateStatus 未定义”。

我假设我的问题出在我的项目映射中。如果我删除点击处理程序,所有内容都会正确绑定(bind)并显示。

如果有人可以帮助我,也许指出我缺少什么,那将非常有帮助。我对 knockout 的东西有点陌生,所以我可能错过了一些明显/简单的东西。

(不,我的 fiddle 中的数据都不是敏感数据或真实数据,只是虚拟数据。:) )

最佳答案

我确实在the KnockoutJs JabbR chat room中回答了您的问题.

你的假设是正确的。问题似乎主要是你的映射。您甚至从未调用 PaycheckBudget 类的构造函数。例如,您的 BudgetListViewModel 构造函数如下所示:

var BudgetListViewModel = function(data) {
var self = this;
self.budgets = ko.observableArray(data);
};

但可能应该是这样的:

var BudgetListViewModel = function(data) {
var self = this;
self.budgets = ko.observableArray(ko.utils.arrayMap(data, function(item){
return new PaycheckBudget(item);
}));
};

我对你的 jsfiddle 进行了一些编辑,并在以下位置有一个工作示例:http://jsfiddle.net/KBpET/ 。我确实首先编辑了其他映射,所以我从未检查过项目映射是否正确,但我确信您能够解决该步骤(项目的代码已在链接的 fiddle 中更改)。

希望对你有帮助!

/罗伯特

关于javascript - Knockout - 将单击绑定(bind)到嵌套数组子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com