【问题标题】:Knockout bind error, unable to bind viewModel inside iFrame敲除绑定错误,无法在 iFrame 中绑定 viewModel
【发布时间】:2015-11-14 11:06:35
【问题描述】:

我正在尝试绑定一个淘汰赛模板,但无法解决问题,我尝试过一百万种方法。

我现在对任何想法都很迷茫,我从几天以来一直在调试它。

在其他页面上也获取了相同的模板,并且工作正常。

我尝试打印 $data 对象,它显示数据可用,但是在同一个模板上它没有绑定 值。

我收到了Uncaught TypeError: Unable to process binding "with: function (){return selectedView }" Message: Unable to process binding "template: function (){return {name:templateName,data:data} }" 由于模板未绑定,因此基本上是一连串错误。 这是一些视图代码:

#page-hold{data: {role: 'page', theme: 'a'}}
  .container{ "data-bind" => "with: selectedView"}
    %div{ "data-bind" => "template : {name: templateName, data: data}" , data: {role: 'content'}}


%script{ "id" => "tpl_landing", "type" => "text/html"}

//html partials

数据对象如下所示

{
  "views": [
    {
      "title": "landing",
      "templateName": "tpl_landing",
      "data": {
        "base": {
        /// data
        }

最新更新:我对问题有了更深入的了解,经过更多调试后,我发现 viewModel($data object) 可以在 iframe 中访问,但确实如此除了 $data 对象之外,不要在页面上绑定或输出任何内容,这为我提供了所有数据的 JSON。想知道为什么当我看到它存在时数据没有被绑定。

谁能帮我调试一下?

谢谢

【问题讨论】:

  • 也许您可以在 Google Chrome 中尝试您的应用程序,这可能会提供有关错误的更多详细信息。
  • 我已经在使用 Chrome 了,这就是它返回的全部内容。有没有更好的方法来利用页面上的 $data 对象?谢谢。
  • 如果您在开发者工具打开的情况下运行您的页面,您还应该获得错误的堆栈跟踪。你能试试吗?还有关于 TypeError 是由什么引起的更多细节吗?
  • 我在无休止地挖掘之后发现的唯一具体原因是试图将 $data 绑定到 iframe,尽管我没有成功实现它,但我正在尝试类似:jsfiddle.net/sujesharukil/NnT78/10但是当我在我的 js 文件中的 ko.applyBindings 之前发布它时,它会返回错误并且无法运行。
  • 那个jsFiddle有从JS代码生成的iframe内容。这是您正在做的事情还是正在加载单独的 HTML 页面?见jsfiddle.net/mbest/GYRUX

标签: javascript knockout.js data-binding binding


【解决方案1】:

Knockout 支持跨窗口绑定(在窗口之间共享视图模型),但不直接支持在窗口之间共享模板。 (你可能会写一个自定义的templateEngine,但这已经很高级了。)

我想出了一个应用模板并绑定<iframe> 的绑定,我认为它可以满足您的需求。

ko.bindingHandlers.iframeTemplate = {
    update: function (element, valueAccessor) {
        var iframedoc = element.contentDocument,
            options = valueAccessor(),
            templateSource = ko.templateEngine.prototype.makeTemplateSource(ko.unwrap(options.template)),
            templateText = templateSource.text(),
            templateNodes = ko.utils.parseHtmlFragment(templateText, iframedoc),
            iframebody = iframedoc.body;

        ko.virtualElements.setDomNodeChildren(iframebody, templateNodes);
        ko.applyBindings(options.data, iframebody);
    }
};

使用示例:http://jsfiddle.net/mbest/udhm4qj4/

【讨论】:

  • 首先,感谢您抽出宝贵时间对其进行深入评估!用上面的例子修正了一些错别字,这是一个工作小提琴jsfiddle.net/h4re864j/1。我将尝试使用 templateEngine 方法并解决一些问题,感谢您为我指明正确的方向,干杯! : ]
  • 糟糕。我不知道那些“错别字”是怎么进来的。现在已经修好了。
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 2015-05-26
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2012-06-09
  • 2014-06-27
相关资源
最近更新 更多