Search in sources :

Example 1 with WXStatement

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;
}
Also used : WXStatement(com.taobao.weex.dom.binding.WXStatement)

Example 2 with WXStatement

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;
}
Also used : WXStatement(com.taobao.weex.dom.binding.WXStatement)

Example 3 with WXStatement

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;
}
Also used : Answer(org.mockito.stubbing.Answer) WXDiv(com.taobao.weex.ui.component.WXDiv) WXDomObject(com.taobao.weex.dom.WXDomObject) InvocationOnMock(org.mockito.invocation.InvocationOnMock) WXTextDomObject(com.taobao.weex.dom.WXTextDomObject) WXDomObject(com.taobao.weex.dom.WXDomObject) TestDomObject(com.taobao.weex.dom.TestDomObject) WXCellDomObject(com.taobao.weex.dom.WXCellDomObject) WXTextDomObject(com.taobao.weex.dom.WXTextDomObject) JSONObject(com.alibaba.fastjson.JSONObject) WXText(com.taobao.weex.ui.component.WXText) WXCellDomObject(com.taobao.weex.dom.WXCellDomObject) WXCell(com.taobao.weex.ui.component.list.WXCell) WXStatement(com.taobao.weex.dom.binding.WXStatement)

Example 4 with WXStatement

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;
}
Also used : WXComponent(com.taobao.weex.ui.component.WXComponent) HashMap(java.util.HashMap) Token(com.taobao.weex.el.parse.Token) WXStatement(com.taobao.weex.dom.binding.WXStatement) WXVContainer(com.taobao.weex.ui.component.WXVContainer) WXDomObject(com.taobao.weex.dom.WXDomObject) JSONObject(com.alibaba.fastjson.JSONObject) Collection(java.util.Collection) WXDomObject(com.taobao.weex.dom.WXDomObject) JSONObject(com.alibaba.fastjson.JSONObject) ArrayList(java.util.ArrayList) WXRecyclerTemplateList(com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList) List(java.util.List) HashMap(java.util.HashMap) ArrayMap(android.support.v4.util.ArrayMap) Map(java.util.Map) WXAttr(com.taobao.weex.dom.WXAttr)

Aggregations

WXStatement (com.taobao.weex.dom.binding.WXStatement)4 JSONObject (com.alibaba.fastjson.JSONObject)2 WXDomObject (com.taobao.weex.dom.WXDomObject)2 ArrayMap (android.support.v4.util.ArrayMap)1 TestDomObject (com.taobao.weex.dom.TestDomObject)1 WXAttr (com.taobao.weex.dom.WXAttr)1 WXCellDomObject (com.taobao.weex.dom.WXCellDomObject)1 WXTextDomObject (com.taobao.weex.dom.WXTextDomObject)1 Token (com.taobao.weex.el.parse.Token)1 WXComponent (com.taobao.weex.ui.component.WXComponent)1 WXDiv (com.taobao.weex.ui.component.WXDiv)1 WXText (com.taobao.weex.ui.component.WXText)1 WXVContainer (com.taobao.weex.ui.component.WXVContainer)1 WXCell (com.taobao.weex.ui.component.list.WXCell)1 WXRecyclerTemplateList (com.taobao.weex.ui.component.list.template.WXRecyclerTemplateList)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1