9

iframeKnockout を使用してデータをバインドする方法を教えてください。以下のようにこれを実行しようとしましたが、期待どおりに機能しません。

<iframe data-bind ="attr: { src: testcontent}"></iframe>

そしてJavascript:

var ViewModel = function (content) {
     this.testcontent = ko.observable(content);
};

ko.applyBindings(new ViewModel("Hello World!!"));

「Hello Content」というテキストを に追加したいと考えていますiframe。誰でもこれについて私を助けてもらえますか?

4

3 に答える 3

11

警告:これには明らかにセキュリティへの影響があります! これは、絶対に信頼できるソースからのコードでのみ行ってください。

これは、構築するための基本的で簡単なソリューションです。これにより、html 構造全体でオブザーバブルを保持し、そのデータで iFrame を埋めることができます。html を更新すると、iframe が新しいバージョンで更新されます。

ko.bindingHandlers.iframeContent = {
    update: function(element, valueAccessor) {
        var value = ko.unwrap(valueAccessor());
        element.contentWindow.document.close(); // Clear the content
        element.contentWindow.document.write(value);
    }
};

ko.applyBindings({
    myHtml: ko.observable("<html>\n<head><title>Test</title></head>\n<body>\n\nMy <em>fine</em> text.\n\n</body>\n</html>")
});

これをビューで次のように使用できます。

<p>Edit your html:</p>
<textarea data-bind="value: myHtml, valueUpdate: 'afterkeydown'"></textarea>

<p>And see it appear in an iframe:</p>
<iframe data-bind="iframeContent: myHtml"></iframe>

デモについては、この jsfiddleを参照してください。はvalueUpdate単にそこにあるだけなので、デモはより明確になります。より大きなシナリオでそれが良いアイデアであるかどうかは議論の余地があります.

于 2014-10-03T08:25:36.383 に答える
8

編集: フィドルが更新されました。

http://jsfiddle.net/sujesharukil/NnT78/10/

このためのカスタム バインディング ハンドラーを作成する必要があります。私はhttp://jsfiddle.net/mbest/GYRUX/でそのようなものを使用しました

ニーズに合わせて変更しました。両方を見て、ニーズに合ったものを見つけてください。

ko.bindingHandlers.bindIframe = {
    init: function(element, valueAccessor) {
        function bindIframe() {
            try {
                var iframeInit = element.contentWindow.initChildFrame,
                    iframedoc = element.contentDocument.body;
            } catch(e) {
                // ignored
            }
            if (iframeInit)
                iframeInit(ko, valueAccessor());
            else if (iframedoc){
                var span = document.createElement('span');
                span.setAttribute('data-bind', 'text: someProperty');
                iframedoc.appendChild(span);
                ko.applyBindings(valueAccessor(), iframedoc);
            }
        };
        bindIframe();
        ko.utils.registerEventHandler(element, 'load', bindIframe);
    }
};
于 2013-03-20T13:45:22.180 に答える
0

あなたはこのようなコードを持つことができ、絶対にうまく動作します:-

// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
            function AppViewModel() {
                this.externalUrl = ko.observable("http://www.w3schools.com");

            }

            // Activates knockout.js
            ko.applyBindings(new AppViewModel());

また

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test IFrame</title>
    <script src="Scripts/jquery-1.7.1.js"></script>

    <script src="Scripts/knockout-2.2.1.js"></script>
    <script>
        $(document).ready(function () {
            // This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI
            function AppViewModel() {
                this.externalUrl = "http://www.w3schools.com";

            }

            // Activates knockout.js
            ko.applyBindings(new AppViewModel());
        });

    </script>
</head>
<body>
    <iframe class="iframe" id="iframe" style="width: 700px; height: 700px" data-bind="attr: { src: externalUrl }"></iframe>

</body>
</html>
于 2013-03-20T20:26:09.900 に答える