Javascript 淘汰赛js+;聚合物:绑定断裂(铬以外)
编辑:这只出现在Chrome之外 我使用KO来使用foreach绑定填充元素。另一方面,我已经装载了聚合物,以利用谷歌的材料设计风格 问题是platform.js文件(Polymer)中似乎有一个断言试图接管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
数据绑定
,即使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');});