所以我现在一直在使用Polymer大约一天,而且我在解决这个问题上遇到了麻烦,所以如果我的方法偏离基础,请不要觉得有必要解决这个问题,而是指出我正确的方向.
我有自定义元素中的自定义元素,我希望子元素影响父元素的属性.我正在采取的方法是创建一个单击处理程序,关闭IIFE中的父元素,然后将该处理程序传递给子组件.像这样......
Polymer({
ready: function(){
this.superHandler = (function(p) {
return function() {
// "this" here will be the sub-component
p.title = this.title;
}
})(this);
}
});
Run Code Online (Sandbox Code Playgroud)
父元素在其模板中使用它的方式如...
<polymer-element name="parent-element">
<template>
<sub-element on-click={{superHandler}} />
</template>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)
这(在我的真实代码中,虽然它可能存在这里的拼写错误)在除了IE之外的所有东西都可以工作,我知道IE不是官方支持的,但是它非常接近我不想放弃它.我想避免的事情是重复引用parentNodes和shadowRoots以获取我正在寻找的父级.
编辑
我忘了提到它在IE中是如何失败的,以及为什么我要避免使用parentNode调用.在IE中,当它专门派遣事件聚合物.js的第9131行时,变量"method"和obj [method]中的引用是IE中的字符串,因此没有方法适用.我想避免使用parentNode的原因是因为调用者不是直接父节点,所以我不想继续获取parentNodes,直到找到正确的节点,因为当我可以命名变量时代码更容易理解.
编辑2
我现在要做的事情(因为它在IE9中工作),虽然我将问题留给更好的答案是继续使用IIFE,返回一个带有参数的函数.然后,孩子将通过querySelector找到感兴趣的父母.这意味着孩子必须具备父母的先验知识和调用方法,这不是理想的,但是...... IE.
所以父母将其设置为......
Polymer('parent-element', {
ready: function(){
this.superHandler = (function(p) {
return function(child) {
p.title = chile.title;
}
})(this);
}
});
Run Code Online (Sandbox Code Playgroud)
并且孩子必须通过查询选择器获取它,例如'parent-element'并且知道名称'superHandler'(不是实际名称)
Polymer('child-element',{
clickHandler: function(){
var p = document.querySelector('parent-element').superHandler;
p(this);
}
});
Run Code Online (Sandbox Code Playgroud)
好主意?
我已经按照从入门页面注入jQuery的示例,这很好用.我在同一目录中有一个jQuery的本地副本,并执行类似...
if(page.injectJs('jquery.min.js')) {
page.evaluate(function(){
//Use jQuery or $
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试注入自己的脚本时,我没有任何函数可用.假设我有一个名为myScript.js的脚本
function doSomething() {
// doing something...
}
Run Code Online (Sandbox Code Playgroud)
我不能再使用doSomething ...
if(page.injectJs('myScript.js')) {
console.log('myScript injected... I think');
page.evaluate(function() {
doSomething();
});
} else {
console.log('Failed to inject myScript');
}
Run Code Online (Sandbox Code Playgroud)
我试过了
window.doSomething = function() {};
Run Code Online (Sandbox Code Playgroud)
和
document.doSomething = function() {};
Run Code Online (Sandbox Code Playgroud)
同时没有运气,以及尝试在随后的page.evaluate()中使用window.doSomething()或document.doSomething()调用它们.
如何使用XMLStreamWriter准确写出我输入的内容?例如,如果我创建脚本标记并用javascript填充它,我不希望我的所有单引号都出现为'
这是我写的一个小测试,它没有使用我已经实现的任何抽象,只是调用writeCharacters.
public void testWriteCharacters() {
StringWriter sw = new StringWriter();
XMLOutputFactory factory = XMLOutputFactory.newInstance();
StringBuffer out = new StringBuffer();
try {
XMLStreamWriter writer = factory.createXMLStreamWriter(sw);
writer.writeStartElement("script");
writer.writeAttribute("type","text/javascript");
writer.writeCharacters("function hw(){ \n"+
"\t alert('hello world');\n" +
"}\n");
writer.writeEndElement();
out.append(sw);
} catch (XMLStreamException e) {
} finally {
try {
sw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
System.out.println(out.toString());
}
Run Code Online (Sandbox Code Playgroud)
这为围绕hello world的单引号生成了一个实体.
基本上我有这个
@implementation MyView : CPView
{
CPArray MyPanelArray;
}
// Populate the MyPanelArray and position each panel
- (void)initMyView
{
...
}
Run Code Online (Sandbox Code Playgroud)
MyPanels几乎是图像的包装器.当一切都被初始化时,它就会很好.然后我有一个滑块来操纵图像的位置,我知道如何重绘所有内容的唯一方法是用新实例覆盖MyView并在主内容中执行类似的操作
// Has the correct effect, but feels wrong
- (void)sliderAction:(id)sender
{
var myNewView = [MyView initWithPositionValue:[sender value]];
[_contentView replaceSubview:_myView with:myNewView];
_myView = myNewView;
}
Run Code Online (Sandbox Code Playgroud)
它可以正常工作,但我怀疑这是"正确的方法".
*我知道我可以使用CPCollectionView进行基本设置,但它不能用于我想要完成的任务.
提前致谢.