2014-07-01 53 views
2

之前聚合物上的数据我试图使用requirejs与聚合物:聚合物+ requirejs:属性上是升级元素

<polymer-element name="test-element"> 
    <script> 
    require(['module'], function (module) { 
     Polymer('test-element', module); 
    }); 
    </script> 
    <template> 
    Test 
    </template> 
</polymer-element> 

但我得到警告:

Attributes on test-element were data bound prior to Polymer upgrading the element. This may result in incorrect binding types. 
  1. 我应该关心这个警告吗?
  2. 在Polymer升级元素后,我能做些什么来使 属性成为数据绑定?
  3. 是 有没有其他聚合物专用加载程序将AMD模块加载到 聚合物网络组件中?

---------编辑
原来,仅当测试元件是anouther聚合物网络部件内部发生问题。 我创建了一个GitHub库显示此: https://github.com/finalclass/polymer-bug-requirejs

回答

3

编辑:感谢澄清,这仅仅是一个问题,当你聚合物元件是另一种聚合物元件内。这指出了潜在的问题。这不是特别使用requirejs;你可以通过一些重现警告像

<script> 
    setTimeout(function() { 
    Polymer('test-b', {}); 
    }, 0); 
</script> 

在这两种情况下,Polymer('test-b', ...)功能是异步的父元素之后(<test-a>在你的例子)调用已经被完全初始化,而这显然不是一个好的做法。

你可以重构一些东西来得到Polymer感到满意的东西。举例来说,如果module也有不少,你要对你<test-b>设置的属性,你可以推迟加载模块并设置他们,直到created回调已被解雇后,像这样:

<script> 
    Polymer('test-b', { 
    created: function() { 
     var testB = this; 
     require(['test-b-js'], function (module) { 
     // There might be a more efficient way to copy over the properties... 
     Object.keys(module).forEach(function(key) { 
      testB.publish[key] = module[key]; 
     }); 
     }); 
    } 
    }); 
</script> 

这也遵循documented best practice用于初始化数组/对象的属性,而不必担心共享状态陷阱,因此还有一个额外的好处。在created回调期间,有一点需要注意的是,这些属性实际上不会被设置,而是稍微有点后(因为require()中的回调再次是异步的),但实际上这可能不是问题。

潜在的更大问题是这些属性不会是published;如果这对你很重要,那么需要一个更有创意的解决方案。

+0

感谢您的澄清。不幸的是,这不是我的问题的答案:( –

1

杰夫的答案讨论是正确的钱。一旦以某种方式推迟元素的注册(例如setTimeout,require),您必须确保没有其他人在元素准备就绪之前尝试使用元素。

另一种可能性是只推迟访问模块代码,而不是完全阻塞元件,是这样的:

<script> 
(function() { 

    var base = null; 
    require(['base'], function(module) { 
    base = module; 
    }); 

    Polymer({ 
    get name() { 
     return base ? null : base.name; 
    } 
    }); 

})(); 
</script>