use of com.taobao.weex.dom.binding.WXStatement in project incubator-weex by apache.
the class WXAttr method filterBindingStatement.
/**
* filter dynamic attrs and statements
*/
private boolean filterBindingStatement(String key, Object value) {
if (COMPONENT_PROPS.equals(key)) {
ELUtils.bindingBlock(value);
return false;
}
for (String exclude : EXCLUDES_BINDING) {
if (key.equals(exclude)) {
return false;
}
}
if (ELUtils.isBinding(value)) {
if (mBindingAttrs == null) {
mBindingAttrs = new ArrayMap<String, Object>();
}
value = ELUtils.bindingBlock(value);
mBindingAttrs.put(key, value);
return true;
}
if (WXStatement.WX_IF.equals(key)) {
if (mStatement == null) {
mStatement = new WXStatement();
}
if (value != null) {
mStatement.put(key, Parser.parse(value.toString()));
}
return true;
}
if (WXStatement.WX_FOR.equals(key)) {
if (mStatement == null) {
mStatement = new WXStatement();
}
value = ELUtils.vforBlock(value);
if (value != null) {
mStatement.put(key, value);
return true;
}
}
if (WXStatement.WX_ONCE.equals(key)) {
if (mStatement == null) {
mStatement = new WXStatement();
}
mStatement.put(key, true);
}
return false;
}
use of com.taobao.weex.dom.binding.WXStatement in project incubator-weex by apache.
the class WXAttr method clone.
@Override
protected WXAttr clone() {
WXAttr wxAttr = new WXAttr();
wxAttr.skipFilterPutAll(attr);
if (mBindingAttrs != null) {
wxAttr.mBindingAttrs = new ArrayMap<>(mBindingAttrs);
}
if (mStatement != null) {
wxAttr.mStatement = new WXStatement(mStatement);
}
return wxAttr;
}
use of com.taobao.weex.dom.binding.WXStatement in project incubator-weex by apache.
the class StatementTest method createVForNode.
private WXCell createVForNode() throws Exception {
WXCell cell = new WXCell(WXSDKInstanceTest.createInstance(), new WXCellDomObject(), null, false);
final WXDiv div = new WXDiv(WXSDKInstanceTest.createInstance(), new WXDomObject(), cell);
cell.addChild(div);
WXText text = new WXText(WXSDKInstanceTest.createInstance(), new WXTextDomObject(), div);
WXStatement statement = new WXStatement();
statement.put("[[repeat]]", ELUtils.vforBlock(JSON.parse("{\n" + " '@expression': 'dataList',\n" + " '@index': 'index',\n" + " '@alias': 'item'\n" + " }")));
WXDomObject domObject = (WXDomObject) text.getDomObject();
domObject.getAttrs().setStatement(statement);
div.addChild(text);
PowerMockito.mockStatic(WXComponentFactory.class, new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
WXText renderNode = new WXText(WXSDKInstanceTest.createInstance(), new WXTextDomObject(), div);
return renderNode;
}
});
return cell;
}
use of com.taobao.weex.dom.binding.WXStatement in project incubator-weex by apache.
the class Statements method doRenderComponent.
/**
* @param component component with v-for statement, v-if statement and bind attrs
* @param context execute context
* render component in context, the function do the following work.
* execute component's v-for statement, v-if statement in context,
* and rebuild component's tree with the statement, v-for reuse component execute by pre render.
* if executed, component will be removed, don't remove, just mark it waste;
* may be next render it can be used.
* after statement has executed, render component's binding attrs in context and bind it to component.
*/
private static final int doRenderComponent(WXComponent component, CellRenderContext context, List<WXComponent> updates) {
WXVContainer parent = component.getParent();
WXDomObject domObject = (WXDomObject) component.getDomObject();
WXAttr attrs = domObject.getAttrs();
WXStatement statement = attrs.getStatement();
if (statement != null) {
WXDomObject parentDomObject = (WXDomObject) parent.getDomObject();
Token vif = null;
JSONObject vfor = null;
if (statement.get(WXStatement.WX_IF) instanceof Token) {
vif = (Token) statement.get(WXStatement.WX_IF);
}
if (statement.get(WXStatement.WX_FOR) instanceof JSONObject) {
vfor = (JSONObject) statement.get(WXStatement.WX_FOR);
}
// execute v-for content
if (vfor != null) {
int renderIndex = parent.indexOf(component);
if (vfor.get(WXStatement.WX_FOR_LIST) instanceof Token) {
Token listBlock = (Token) vfor.get(WXStatement.WX_FOR_LIST);
String indexKey = vfor.getString(WXStatement.WX_FOR_INDEX);
String itemKey = vfor.getString(WXStatement.WX_FOR_ITEM);
Object data = null;
if (listBlock != null) {
data = listBlock.execute(context.stack);
}
if ((data instanceof List || data instanceof Map)) {
Collection collection = null;
Map map = null;
if (data instanceof List) {
collection = (List) data;
} else {
map = (Map) data;
collection = map.keySet();
}
Map<String, Object> loop = new HashMap<>();
int index = 0;
for (Object item : collection) {
Object key = null;
Object value = item;
if (map == null) {
key = index;
value = item;
} else {
key = item;
value = map.get(item);
}
if (indexKey != null) {
loop.put(indexKey, key);
}
if (itemKey != null) {
loop.put(itemKey, value);
} else {
context.stack.push(value);
}
if (loop.size() > 0) {
context.stack.push(loop);
}
if (vif != null) {
if (!Operators.isTrue(vif.execute(context.stack))) {
continue;
}
}
// find resuable renderNode
WXComponent renderNode = null;
if (renderIndex < parent.getChildCount()) {
renderNode = parent.getChild(renderIndex);
// check is same statment, if true, it is usabled.
if (!isCreateFromNodeStatement(renderNode, component)) {
renderNode = null;
}
if (renderNode != null) {
if (renderNode.isWaste()) {
renderNode.setWaste(false);
}
}
}
// none resuable render node, create node, add to parent, but clear node's statement
if (renderNode == null) {
long start = System.currentTimeMillis();
renderNode = copyComponentTree(component, parent);
renderNode.setWaste(false);
WXDomObject renderNodeDomObject = (WXDomObject) renderNode.getDomObject();
if (renderNodeDomObject.getAttrs().getStatement() != null) {
renderNodeDomObject.getAttrs().getStatement().remove(WXStatement.WX_FOR);
// clear node's statement
renderNodeDomObject.getAttrs().getStatement().remove(WXStatement.WX_IF);
}
parentDomObject.add(renderNodeDomObject, renderIndex);
parent.addChild(renderNode, renderIndex);
updates.add(renderNode);
if (WXEnvironment.isApkDebugable()) {
WXLogUtils.d(WXRecyclerTemplateList.TAG, Thread.currentThread().getName() + renderNode.getRef() + renderNode.getDomObject().getType() + "statements copy component tree used " + (System.currentTimeMillis() - start));
}
}
doBindingAttrsEventAndRenderChildNode(renderNode, (WXDomObject) renderNode.getDomObject(), context, updates);
renderIndex++;
if (loop.size() > 0) {
context.stack.push(loop);
}
if (itemKey == null) {
context.stack.pop();
}
}
}
} else {
WXLogUtils.e(WXRecyclerTemplateList.TAG, vfor.toJSONString() + " not call vfor block, for pre compile");
}
// after v-for execute, remove component created pre v-for.
for (; renderIndex < parent.getChildCount(); renderIndex++) {
WXComponent wasteNode = parent.getChild(renderIndex);
if (!isCreateFromNodeStatement(wasteNode, component)) {
break;
}
wasteNode.setWaste(true);
}
return renderIndex - parent.indexOf(component);
}
// execute v-if context
if (vif != null) {
if (!Operators.isTrue(vif.execute(context.stack))) {
component.setWaste(true);
return 1;
} else {
component.setWaste(false);
}
}
}
doBindingAttrsEventAndRenderChildNode(component, domObject, context, updates);
return 1;
}
Aggregations