【发布时间】:2013-03-11 22:31:14
【问题描述】:
我有以下几点:
HTML
<div id="documentsList" data-bind="foreach: documents">
<span class="ui-icon ui-icon-document" data-bind="click: $root.onViewDocumentClick"></span>
</div>
JAVASCRIPT
documentViewModel = new function() {
var self = this;
self.documents = ko.observableArray([]); //Loaded elsewhere
self.onViewDocumentClick = function(data) {
var path = "/ViewDocument/0";
var url = path.replace("/0","/" + data.Id.ToString());
window.location = url;
}
}
$(function() {
$ko.applyBindings(documentViewModel,$("#documentsList")[0]);
});
我的问题是,一旦加载了文档并单击图标,页面就会重新加载,但它表明页面实际上正在尝试重新加载 /ViewDocument/undefined ...这当然会引发错误,因为该页面不存在。
如果我进行以下更改以通过 jQuery 而不是 Knockout 处理单击事件,那么一切正常。
HTML
<span class="ui-icon ui-icon-document" data-bind="text: Id"></span>
JAVASCRIPT
$("#documentsList").on("click","span.ui-icon-document",function() {
var path = "/ViewDocument/0";
var url = path.replace("/0","/" + $(this).text());
window.location = url;
});
我错过了什么?
编辑 这是演示我的问题的小提琴:Fiddle Example 如果您将 div 的名称更改为 documentList2,您将看到正确的行为。如果您将其保留为 documentList,您将看到错误。 请务必在更改 div 名称后运行
【问题讨论】:
-
window.location不是你的问题。data.Id.ToString()似乎正在返回undefined。 -
不,我在数组中的对象不是可观察的,也没有可观察的属性。见上面的小提琴。
-
你的小提琴之前似乎工作正常,特别是如果我将 URL 更改为使用
data.id,因为那是具有路径的部分:jsfiddle.net/jtbowden/CQS5q/1 -
对不起,午饭前我赶时间。这是一个更新的小提琴:jsfiddle.net/LzFx6/3。顶部列表中的项目返回错误。底部列表中的项目有效。 (在 Chrome 中运行)
-
我还是不明白你为什么用
data.name。data.name包含“Fiddle 1”和“Fiddle 2”,这不是您想要的。你想要data.id。
标签: javascript jquery knockout.js