2013-03-08 98 views
0

我有以下幾點:window.location的內部knockoutjs視圖模型不能正常工作

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你會看到正確的行爲Fiddle Example 。如果你離開它documentList,你會看到錯誤。 請務必在更改div名稱後運行

+0

'window.location'不是你的問題。看起來'data.Id.ToString()'返回'undefined'。 – 2013-03-08 17:00:07

+0

不,我在數組中的對象不是可觀察對象,也沒有可觀察屬性。看到上面的小提琴。 – RHarris 2013-03-08 17:36:24

+0

你的小提琴似乎以前工作得很好,特別是如果我更改URL以使用'數據。id',因爲這是具有路徑的部分:http://jsfiddle.net/jtbowden/CQS5q/1/ – 2013-03-08 17:52:09

回答

0

事實證明,我有兩個其他單擊documentList元素上的綁定(綁定到其他子元素)。但是,這些在window.location生效之前正在觸發。所以,在window.location能夠執行的時候,url var超出了範圍。

0

您確定Id是在您的文檔對象中定義的嗎? /ViewDocument/undefined似乎表示data.Id.ToString()正在解析爲undefined

我放在一起在這裏提琴似乎工作正常,當我在文檔對象定義Id

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

我註釋掉window.location行出於顯而易見的原因,但我可以清楚地看到我的調試它試圖訪問正確的URL的控制檯。

+0

Id是絕對定義的。我已經加入了調試器(chrome),並在window.location之前立即添加了一個警報,以顯示url的值,並正確顯示。 – RHarris 2013-03-08 17:29:25

0

我不知道這是否是一個錯字,但它是 「的toString()」 而不是 「的ToString」

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

應該

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