Search in sources :

Example 6 with ArrayStack

use of com.taobao.weex.el.parse.ArrayStack in project incubator-weex by apache.

the class ParserTest method createContext.

private ArrayStack createContext() {
    JSONObject data = new JSONObject();
    data.put("item", new JSONObject());
    data.put("index", 20);
    data.put("1", 10);
    data.put("source", true);
    data.put("e6", 10);
    data.put("e7", "e7hello");
    data.put("ratio", 6);
    data.put("count", 6);
    data.getJSONObject("item").put("name", "hello world");
    data.getJSONObject("item").put("1", 10);
    ArrayStack context = new ArrayStack();
    context.push(data);
    return context;
}
Also used : JSONObject(com.alibaba.fastjson.JSONObject) ArrayStack(com.taobao.weex.el.parse.ArrayStack)

Example 7 with ArrayStack

use of com.taobao.weex.el.parse.ArrayStack in project incubator-weex by apache.

the class Statements method doRenderBindingAttrsAndEvent.

/**
 * render dynamic binding attrs and bind them to component node.
 */
private static void doRenderBindingAttrsAndEvent(WXComponent component, WXDomObject domObject, CellRenderContext context) {
    ArrayStack stack = context.stack;
    component.setWaste(false);
    WXAttr attr = domObject.getAttrs();
    if (attr != null && attr.getBindingAttrs() != null && attr.getBindingAttrs().size() > 0) {
        ArrayMap<String, Object> bindAttrs = domObject.getAttrs().getBindingAttrs();
        Map<String, Object> dynamic = renderBindingAttrs(bindAttrs, stack);
        Set<Map.Entry<String, Object>> entries = dynamic.entrySet();
        /**
         * diff attrs, see attrs has update, remove none update attrs
         */
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();
            String key = entry.getKey();
            Object value = entry.getValue();
            Object oldValue = attr.get(key);
            if (value == null) {
                if (oldValue == null) {
                    iterator.remove();
                    continue;
                }
            } else {
                if (value.equals(oldValue)) {
                    iterator.remove();
                }
            }
        }
        if (dynamic.size() > 0) {
            if (dynamic.size() == 1 && dynamic.get(Constants.Name.SRC) != null && component instanceof WXImage) {
                // for image avoid dirty layout, only update src attrs
                domObject.getAttrs().put(Constants.Name.SRC, dynamic.get(Constants.Name.SRC));
            } else {
                // dirty layout
                domObject.updateAttr(dynamic);
            }
            if (isMainThread()) {
                component.updateProperties(dynamic);
            }
            dynamic.clear();
        }
    }
    WXStyle style = domObject.getStyles();
    if (style != null && style.getBindingStyle() != null) {
        ArrayMap<String, Object> bindStyle = style.getBindingStyle();
        Map<String, Object> dynamic = renderBindingAttrs(bindStyle, stack);
        Set<Map.Entry<String, Object>> entries = dynamic.entrySet();
        /**
         * diff attrs, see attrs has update, remove none update attrs
         */
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();
            String key = entry.getKey();
            Object value = entry.getValue();
            Object oldValue = style.get(key);
            if (value == null) {
                if (oldValue == null) {
                    iterator.remove();
                    continue;
                }
            } else {
                if (value.equals(oldValue)) {
                    iterator.remove();
                }
            }
        }
        if (dynamic.size() > 0) {
            domObject.updateStyle(dynamic, false);
            domObject.applyStyle(dynamic);
            if (isMainThread()) {
                component.updateProperties(dynamic);
            }
        }
    }
    WXEvent event = domObject.getEvents();
    if (event == null || event.getEventBindingArgs() == null) {
        return;
    }
    Set<Map.Entry<String, Object>> eventBindArgsEntrySet = event.getEventBindingArgs().entrySet();
    for (Map.Entry<String, Object> eventBindArgsEntry : eventBindArgsEntrySet) {
        List<Object> values = getBindingEventArgs(stack, eventBindArgsEntry.getValue());
        if (values != null) {
            event.putEventBindingArgsValue(eventBindArgsEntry.getKey(), values);
        }
    }
}
Also used : WXStyle(com.taobao.weex.dom.WXStyle) ArrayStack(com.taobao.weex.el.parse.ArrayStack) WXEvent(com.taobao.weex.dom.WXEvent) WXDomObject(com.taobao.weex.dom.WXDomObject) JSONObject(com.alibaba.fastjson.JSONObject) WXImage(com.taobao.weex.ui.component.WXImage) HashMap(java.util.HashMap) ArrayMap(android.support.v4.util.ArrayMap) Map(java.util.Map) WXAttr(com.taobao.weex.dom.WXAttr)

Example 8 with ArrayStack

use of com.taobao.weex.el.parse.ArrayStack in project incubator-weex by apache.

the class Statements method doBindingAttrsEventAndRenderChildNode.

/**
 * bind attrs and doRender component child
 */
private static void doBindingAttrsEventAndRenderChildNode(WXComponent component, WXDomObject domObject, CellRenderContext context, List<WXComponent> updates) {
    WXAttr attr = component.getDomObject().getAttrs();
    /**
     * sub component supported, sub component new stack
     */
    ArrayStack stack = context.stack;
    if (attr.get(ELUtils.IS_COMPONENT_ROOT) != null && WXUtils.getBoolean(attr.get(ELUtils.IS_COMPONENT_ROOT), false)) {
        if (attr.get(ELUtils.COMPONENT_PROPS) != null && attr.get(ELUtils.COMPONENT_PROPS) instanceof JSONObject) {
            String compoentId = (String) attr.get(CellDataManager.SUB_COMPONENT_TEMPLATE_ID);
            Object compoentData = null;
            if (!TextUtils.isEmpty(compoentId)) {
                String virtualComponentId = context.getRenderState().getVirtualComponentIds().get(component.getViewTreeKey());
                if (virtualComponentId == null) {
                    // none virtualComponentId, create and do attach
                    virtualComponentId = CellDataManager.createVirtualComponentId(context.templateList.getRef(), component.getViewTreeKey(), context.templateList.getItemId(context.position));
                    Map<String, Object> props = renderProps((JSONObject) attr.get(ELUtils.COMPONENT_PROPS), context.stack);
                    EventResult result = WXBridgeManager.getInstance().syncCallJSEventWithResult(WXBridgeManager.METHD_COMPONENT_HOOK_SYNC, component.getInstanceId(), null, compoentId, VirtualComponentLifecycle.LIFECYCLE, VirtualComponentLifecycle.CREATE, new Object[] { virtualComponentId, props }, null);
                    if (result != null && result.getResult() != null && result.getResult() instanceof Map) {
                        props.putAll((Map<? extends String, ?>) result.getResult());
                    }
                    compoentData = props;
                    context.getRenderState().getVirtualComponentIds().put(component.getViewTreeKey(), virtualComponentId);
                    context.templateList.getCellDataManager().createVirtualComponentData(context.position, virtualComponentId, compoentData);
                    // create virtual componentId
                    WXBridgeManager.getInstance().asyncCallJSEventVoidResult(WXBridgeManager.METHD_COMPONENT_HOOK_SYNC, component.getInstanceId(), null, virtualComponentId, VirtualComponentLifecycle.LIFECYCLE, VirtualComponentLifecycle.ATTACH, null);
                } else {
                    // get virtual component data check has dirty's update
                    compoentData = context.getRenderState().getVirtualComponentDatas().get(virtualComponentId);
                    if (context.getRenderState().isHasDataUpdate()) {
                        Map<String, Object> props = renderProps((JSONObject) attr.get(ELUtils.COMPONENT_PROPS), context.stack);
                        EventResult result = WXBridgeManager.getInstance().syncCallJSEventWithResult(WXBridgeManager.METHD_COMPONENT_HOOK_SYNC, component.getInstanceId(), null, virtualComponentId, VirtualComponentLifecycle.LIFECYCLE, VirtualComponentLifecycle.SYNSTATE, new Object[] { virtualComponentId, props }, null);
                        if (result != null && result.getResult() != null && result.getResult() instanceof Map) {
                            props.putAll((Map<? extends String, ?>) result.getResult());
                            context.templateList.getCellDataManager().updateVirtualComponentData(virtualComponentId, props);
                            compoentData = props;
                        }
                    }
                }
                component.getDomObject().getAttrs().put(CellDataManager.VIRTUAL_COMPONENT_ID, virtualComponentId);
            } else {
                // stateless component
                Map<String, Object> props = renderProps((JSONObject) attr.get(ELUtils.COMPONENT_PROPS), context.stack);
                compoentData = props;
            }
            // virtual component is new context
            context.stack = new ArrayStack();
            if (compoentData != null) {
                context.stack.push(compoentData);
            }
        }
    }
    /**
     * check node is render only once, if render once, and has rendered, just return
     */
    Object vonce = null;
    if (attr.getStatement() != null) {
        vonce = attr.getStatement().get(WXStatement.WX_ONCE);
    }
    if (vonce != null) {
        ArrayStack onceStack = context.getRenderState().getOnceComponentStates().get(component.getViewTreeKey());
        if (onceStack == null) {
            onceStack = context.templateList.copyStack(context, stack);
            context.getRenderState().getOnceComponentStates().put(component.getViewTreeKey(), onceStack);
        }
        context.stack = onceStack;
    }
    doRenderBindingAttrsAndEvent(component, domObject, context);
    if (component instanceof WXVContainer) {
        if (!domObject.isShow()) {
            if (!(component instanceof WXCell)) {
                return;
            }
        }
        WXVContainer container = (WXVContainer) component;
        for (int k = 0; k < container.getChildCount(); ) {
            WXComponent next = container.getChild(k);
            k += doRenderComponent(next, context, updates);
        }
    }
    if (stack != context.stack) {
        context.stack = stack;
    }
}
Also used : WXVContainer(com.taobao.weex.ui.component.WXVContainer) EventResult(com.taobao.weex.bridge.EventResult) JSONObject(com.alibaba.fastjson.JSONObject) WXComponent(com.taobao.weex.ui.component.WXComponent) WXDomObject(com.taobao.weex.dom.WXDomObject) JSONObject(com.alibaba.fastjson.JSONObject) ArrayStack(com.taobao.weex.el.parse.ArrayStack) HashMap(java.util.HashMap) ArrayMap(android.support.v4.util.ArrayMap) Map(java.util.Map) WXCell(com.taobao.weex.ui.component.list.WXCell) WXAttr(com.taobao.weex.dom.WXAttr)

Aggregations

JSONObject (com.alibaba.fastjson.JSONObject)8 ArrayStack (com.taobao.weex.el.parse.ArrayStack)8 ArrayMap (android.support.v4.util.ArrayMap)4 WXDomObject (com.taobao.weex.dom.WXDomObject)4 HashMap (java.util.HashMap)4 Map (java.util.Map)4 WXAttr (com.taobao.weex.dom.WXAttr)2 WXCellDomObject (com.taobao.weex.dom.WXCellDomObject)2 WXRecyclerDomObject (com.taobao.weex.dom.WXRecyclerDomObject)2 WXComponent (com.taobao.weex.ui.component.WXComponent)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 Point (android.graphics.Point)1 EventResult (com.taobao.weex.bridge.EventResult)1 WXEvent (com.taobao.weex.dom.WXEvent)1 WXStyle (com.taobao.weex.dom.WXStyle)1 Token (com.taobao.weex.el.parse.Token)1 WXImage (com.taobao.weex.ui.component.WXImage)1 WXVContainer (com.taobao.weex.ui.component.WXVContainer)1 WXCell (com.taobao.weex.ui.component.list.WXCell)1 CellRenderContext (com.taobao.weex.ui.component.list.template.CellRenderContext)1