Javascript 淘汰赛js+;聚合物:绑定断裂(铬以外)

Javascript 淘汰赛js+;聚合物:绑定断裂(铬以外),javascript,knockout.js,cross-browser,polymer,Javascript,Knockout.js,Cross Browser,Polymer,编辑:这只出现在Chrome之外 我使用KO来使用foreach绑定填充元素。另一方面,我已经装载了聚合物,以利用谷歌的材料设计风格 问题是platform.js文件(Polymer)中似乎有一个断言试图接管数据绑定,即使Polymer没有使用数据绑定属性 想知道是否有人有使用这两种方法的经验,或者有什么建议?错误如下: 错误:无法处理绑定“模板:函数(){return{foreach:sessions}” 消息:断言失败 JSFiddle: 编辑:我已经设置了调试版本,在第31行的Shadow

编辑:这只出现在Chrome之外

我使用KO来使用foreach绑定填充元素。另一方面,我已经装载了聚合物,以利用谷歌的材料设计风格

问题是platform.js文件(Polymer)中似乎有一个断言试图接管
数据绑定
,即使Polymer没有使用数据绑定属性

想知道是否有人有使用这两种方法的经验,或者有什么建议?错误如下:

错误:无法处理绑定“模板:函数(){return{foreach:sessions}”
消息:断言失败

JSFiddle:

编辑:我已经设置了调试版本,在第31行的ShadowDOM/src/wrappers.js中似乎有一个
assert(b)
函数被传递一个布尔值。一个Node.js文件调用了100次,要解决这个问题,似乎需要相当大的重写


我的修复方法是使用jQuery插入带有foreach绑定的DOM元素,然后在
$(document.ready(function(){})中应用我的KO绑定标签。这似乎适用于所有浏览器。

我的修复方法是使用jQuery插入带有foreach绑定的DOM元素,然后在$(document.ready(function(){})中应用我的KO绑定;标签。这似乎适用于所有浏览器


虽然这不是一个很好的解决方案,但它是唯一一个工作正常的解决方案。我已经联系了KnockoutJS的Steve Sanderson,相信他正在调查此事。我之所以采用这种修复方法,而不是仅仅使用淘汰定制组件,是因为聚合物组件按照谷歌的新设计规范提供材料设计,而我正在构建的web前端本质上与我公司的移动应用程序相关联,所以我想保持一种内聚设计。

如果有人有这个问题,这是因为您使用的是
ko.applyBindings(viewModel)
方法,而在这里,knockout使用
window.document.body
来获取节点,这反过来会错过webcomponents.js使用的shadowDOM polyfill

要解决这个问题,您有两个选择,使用applybindings方法的第二个重载-您可能会通过这种方式成功地包装节点

或者,您可以在敲除声明之后立即加载此垫片(从knockout.validation借用的一些样板文件:

(function (factory) {
    // Module systems magic dance.

    if (typeof require === "function" && typeof module === "object") {
        // CommonJS or Node: hard-coded dependency on "knockout"
        factory(require("knockout"));
    } else if (typeof define === "function" && define["amd"]) {
        // AMD anonymous module with hard-coded dependency on "knockout"
        define(["knockout"], factory);
    } else {
        // <script> tag: use the global `ko` object, attaching a `mapping` property
        factory(ko);
    }
}(function (ko) {

    if (typeof (ko) === undefined) { throw 'Knockout is required, please ensure it is loaded before loading this shim'; }

    if (WebComponents && WebComponents.flags.shadow && ShadowDOMPolyfill) {

        var _originalApplyBindings = ko.applyBindings;

        ko.applyBindings = function (viewModel, rootNode) {
            if (rootNode) {
                rootNode = ShadowDOMPolyfill.wrapIfNeeded(rootNode);
            } else {
                rootNode = ShadowDOMPolyfill.wrapIfNeeded(window.document.body);
            }
            _originalApplyBindings(viewModel, rootNode);
        }
    }
}));
(功能(工厂){
//模块系统魔术舞蹈。
if(需要类型==“功能”和模块类型==“对象”){
//CommonJS或节点:硬编码依赖于“淘汰”
工厂(要求(“淘汰”);
}else if(typeof define==“函数”&&define[“amd”]){
//AMD匿名模块,硬编码依赖于“敲除”
定义([“敲除”],工厂);
}否则{
//标记:使用全局'ko'对象,附加'mapping'属性
工厂(高),;
}
}(职能科){
如果(typeof(ko)==undefined){throw'敲除是必需的,请确保在加载此垫片';}之前加载它
if(WebComponents&&WebComponents.flags.shadow&&ShadowDOMPolyfill){
var_originalApplyBindings=ko.applyBindings;
ko.applyBindings=函数(viewModel,rootNode){
if(rootNode){
rootNode=ShadowDOMPolyfill.wrapifneed(rootNode);
}否则{
rootNode=ShadowDOMPolyfill.wrapifneed(window.document.body);
}
_原始应用绑定(viewModel、rootNode);
}
}
}));

希望这能帮助任何有同样问题的人。

你能发布更多的上下文吗?这是全部信息,你没有堆栈吗?错误会发生在哪里?你如何使用聚合物?你可以用你当前的设置创建一个JSFIDLE吗?聚合物已经缩小了-所以它只是说第12行。唯一需要的设置是带敲除的聚合物foreach.我将简短地发布一个JSFIDLE我看不出你的FIDLE中有任何错误,它工作得非常好…你在使用Firefox吗?而且-这是你不得不做的一个令人讨厌的修复:)我建议回答你自己的问题并将其标记为接受,这样它就不会出现在“未回答”队列中当然-它只是:$(document).ready(function(){ko.applyBindings(new knockoutModel(),document.getElementById('elementID');});