0

我有以下内容:

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;
});

我错过了什么?

编辑 这是一个演示我的问题的小提琴:小提琴示例 如果您将 div 的名称更改为 documentList2,您将看到正确的行为。如果您将其保留为 documentList,您将看到错误。请务必在更改 div 名称后运行

4

3 回答 3

0

您确定Id在您的文档对象中定义了吗?/ViewDocument/undefined似乎表明正在data.Id.ToString()解决undefined.

Id我在这里整理了一个小提琴,当我在文档对象中定义时,它似乎工作正常:

http://jsfiddle.net/jtbowden/gf9QT/

出于显而易见的原因,我注释掉了该window.location行,但我可以在调试控制台中清楚地看到它正在尝试访问正确的 URL。

于 2013-03-08T17:22:28.410 回答
0

我不知道这是否是一个错字,但它是“toString()”而不是“ToString”

var url = path.replace("/0","/" + data.Id.ToString());

应该

var url = path.replace("/0","/" + data.Id.toString());
于 2013-03-08T20:54:38.617 回答
0

事实证明,我在 documentList 元素上还有另外两个点击绑定(与其他子元素相关联)。但是,这些是在 window.location 生效之前触发的。因此,当 window.location 能够执行时,url var 超出了范围。

于 2013-03-11T14:31:14.863 回答