GWT несколько действий/мест с одним токеном

Мой сайт имеет слева дерево GWT. В центре находится GWT-TabBar.

Обе части реализованы как Views/Activities/Places. У меня есть два токенизатора: "m" для дерева и "t" для вкладок.

Если я посещу одно место (goTo()), только это место будет использоваться для создания токена истории. Но я хотел бы увидеть это: <page>#m:sub/sub/sub;t:map

Я на самом деле думал, что дыра в идее мероприятий и мест. Я не вижу смысла иметь несколько токенизаторов, когда только один токенизатор может предоставить токен одновременно.


person Marcel Jaeschke    schedule 26.04.2012    source источник


Ответы (1)


Вы не можете отображать два разных жетона #m: и #t: одновременно, так как вы не можете находиться в двух местах одновременно.

Поэтому, если обе вкладки и дерево отображаются одновременно, то состояние обоих должно храниться одновременно в одном и том же месте.

Это более или менее то, что вам нужно.

public class ExamplePlace extends Place {

    public String treePosition = "/";

    public int tabIndex = 0;

    public ExamplePlace() {
        super();
    }

    public ExamplePlace(String treePosition, int tabIndex) {
        this.treePosition = treePosition;
        this.tabIndex = tabIndex;
    }

    @Prefix("overview")
    public static class Tokenizer implements PlaceTokenizer<ExamplePlace> {


        /**
         * parse token to get state
         * 
         */
        @Override
        public ExamplePlace getPlace(String token) {
            String treePosition = "";
            int tabIndex = 0;
            String[] states = token.split(";");
            for (String state : states) {
                String[] mapping = state.split("=");
                if (mapping.length == 2) {
                    if ("t".equals(mapping[0])) {
                        treePosition = mapping[1];
                    }
                    if ("m".equals(mapping[0])) {
                        try {
                            tabIndex = Integer.valueOf(mapping[1]);
                        } catch (Throwable e) {
                        }
                    }
                }
            }
            return new ExamplePlace(treePosition, tabIndex);
        }


        /**
         * store state in token
         * 
         */
        @Override
        public String getToken(ExamplePlace place) {
            StringBuffer sb = new StringBuffer();
            if (place.getTreePosition()!=null) {
                sb.append("t").append("=").append(place.getTreePosition());
               sb.append(";");
            }
            sb.append("m=").append(place.getTabIndex());
            return sb.toString();
        }

    }

    public String getTreePosition() {
        return treePosition;
    }

    public void setTreePosition(String treePosition) {
        this.treePosition = treePosition;
    }

    public int getTabIndex() {
        return tabIndex;
    }

    public void setTabIndex(int tabIndex) {
        this.tabIndex = tabIndex;
    }

}

Это даст вам URL-адреса, которые выглядят как ;

index.html#overview:t=/поддерево/поддерево/лист;m=2

У вас могут возникнуть проблемы с косой чертой в токене, не уверен. При необходимости измените их на какой-либо другой символ;

Активность получает входящее место и внедряет состояние в представление;

person koma    schedule 26.04.2012
comment
Хм, я боюсь, что это будет единственным решением! Прежде чем я нашел GWT-Activities/Places, я случайно применил сопоставимый подход (но с несколькими местами). Что бы ни. Теперь я знаю, что ничего не пропустил в документах! Спасибо. - person Marcel Jaeschke; 27.04.2012
comment
важно то, что вы не можете быть в нескольких местах одновременно, только в нескольких областях отображения, которые управляются отдельными действиями. место определяет, какие действия активируются. - person koma; 27.04.2012