我想在交叉iframe綁定中使用knockout.js。 iframes的存在取決於我正在處理的實際應用程序結構。Knockout.js - 交叉iframe可觀察綁定
這是場景(簡化):
- 主窗口:Knockout.js包括在內。
window.top.DATA
是一個全球性的數據容器,例如。var DATA = { username: ko.observable('John') };
- 模塊iframe窗口:Knockout.js也包括在內。查看想要做存儲在
window.top.DATA
對象顯示數據,使用代碼:<div data-bind="text: window.top.DATA.username></div>
結果是什麼?
DIV的innerHTML包含ko.observable().toString()
內容而不是John
。
原因
Knockout.js不能識別在父幀創建的,同時執行結合可觀察到的,因爲敲除檢查變量是通過比較參考與ko.hasPrototype
觀察到。由於父級和子級框架ko
實例中的原型不同,因此不可能綁定值。在腳本文件的開頭window.ko = window.top.ko || setupKO()
:
解決方案
最簡單的解決辦法是寫的東西等。不幸的是,在這種情況下,綁定像with: window.someLocalObj
引用window.top
而不是window
- 我們無法訪問本地變量,也無法使用template
綁定本地模板。
解決這個問題的另一種方法是簡單地允許knockout識別observables,因爲它應該允許observables跟蹤依賴關係,綁定值並且工作正常。不幸的是,我希望這可能是一件很難實現的事情。你在這裏看到了什麼選擇?
謝謝你的回覆。
編輯
Knockout.js版本:3.2.0。
我已經打了這個自己在淘汰賽。你使用什麼版本?我認爲3中有一個bug使得這不起作用,而2。 – 2014-11-20 22:12:22
如果你做window.top.DATA.username() – Shiala 2014-11-20 22:20:04
@Shiala手動評估可觀察值使得值可見,但改變window.top.DATA.username的值不會填充HTML中的改變。看起來淘汰賽不贊成觀察,因爲認識到這是可觀察的問題。 – Simon 2014-11-20 22:44:23