Nano Hash - криптовалюты, майнинг, программирование

Может ли страница мобильного приложения определить, какая страница мобильного приложения вызвала ее и что было выбрано?

Мое приложение для отслеживания проблем имеет несколько категорий (Клиент, Назначено, Модуль/Тип, Приоритет, Статус, Сборка и т. д.). Существует несколько представлений с двумя категоризированными столбцами (например, «Клиент» и «Кому назначено», «Клиент и модуль», «Кому назначено» и «Приоритет», «Приоритет» и «Клиент» и т. д.

Я реализую мобильные страницы, используя элементы управления XPages Mobile. Я хочу упорядочить вещи, чтобы выбор представления на мобильной домашней странице приводил к странице для выбора соответствующей первой категории, которая, в свою очередь, приводила к странице для выбора второй категории. Чего я не понимаю, так это того, что после выбора значения первой категории и открытия страницы выбора второй категории, какое значение было выбрано ранее?

Вот моя примерная страница:

<xe:singlePageApp
    id="singlePageApp1"
    selectedPageName="mhome">
    <xe:appPage
        id="appPage1"
        pageName="mhome">
        <xe:djxmHeading
            id="djxmHeading1"
            label="Home">
        </xe:djxmHeading>
        <xe:djxmRoundRectList
            id="djxmRoundRectList1">
            <xe:djxmLineItem
                id="djxmLineItem1"
                label="Issues by Client By Assigned To"
                moveTo="selectClient1">
            </xe:djxmLineItem>
            <xe:djxmLineItem
                id="djxmLineItem2"
                label="Issues by Client By Module"
                moveTo="selectClient2">
            </xe:djxmLineItem>
        </xe:djxmRoundRectList>
    </xe:appPage>
    <xe:appPage
        id="appPage2"
        pageName="selectClient1"
        resetContent="true">
        <xe:djxmHeading
            id="djxmHeading2"
            label="Select Client"
            moveTo="mhome"
            back="back">
        </xe:djxmHeading>
        <xp:panel>
            <xp:this.data>
                <xp:dominoView
                    var="view1"
                    viewName="ByClientAssignedTo">
                </xp:dominoView>
            </xp:this.data>
            <xe:djxmRoundRectList
                id="djxmRoundRectList2">
                <xp:repeat
                    id="repeat1"
                    rows="30"
                    value="#{javascript:view1.getColumnValues(0);}"
                    var="client"
                    indexVar="clidx">
                    <xe:djxmLineItem
                        id="djxmLineItem3"
                        label="#{javascript:client}"
                        moveTo="selectAssignedTo1">
                    </xe:djxmLineItem>
                </xp:repeat>
            </xe:djxmRoundRectList>
        </xp:panel>
    </xe:appPage>
    <xe:appPage
        id="appPage3"
        pageName="selectClient2"
        resetContent="true">
        <xe:djxmHeading
            id="djxmHeading3"
            label="Select Client (2)"
            moveTo="mhome"
            back="back">
        </xe:djxmHeading>
        <xp:panel>
            <xp:this.data>
                <xp:dominoView
                    var="view1"
                    viewName="ByClientAssignedTo">
                </xp:dominoView>
            </xp:this.data>
            <xe:djxmRoundRectList
                id="djxmRoundRectList3">
                <xp:repeat
                    id="repeat2"
                    rows="30"
                    value="#{javascript:view1.getColumnValues(0)}"
                    var="client"
                    indexVar="clidx">
                    <xe:djxmLineItem
                        id="djxmLineItem4"
                        label="#{javascript:client}"
                        moveTo="selectType1">
                    </xe:djxmLineItem>
                </xp:repeat>
            </xe:djxmRoundRectList>
        </xp:panel>
    </xe:appPage>
    <xe:appPage
        id="appPage4"
        pageName="selectAssignedTo1"
        resetContent="true">
        <xe:djxmHeading
            id="djxmHeading4"
            back="back"
            label="Select Assigned To"
            moveTo="selectClient1">
        </xe:djxmHeading>
        <xp:text
            escape="true"
            id="computedField1">
            <xp:this.value><![CDATA[#{javascript:"What was selected on the previous page?"}]]></xp:this.value>
        </xp:text>
    </xe:appPage>
</xe:singlePageApp>

Ответы:


1

Способ 1:
Событие djxmLineItem поддерживает событие события onClick, хотя для него нет документации в Xpages (которую я нашел). Он задокументирован как часть dojo в dojox.mobile ListItem.

При необходимости создайте событие onClick для другого элемента управления и скопируйте код под тегом xe:djxmLineItem. Вы можете использовать отложенную оценку (#) для доступа к indexVar, чтобы определить, какой ListItem внутри повтора был нажат.

Основным недостатком добавления обработчика событий является то, что вы должны инициировать частичное обновление чего-либо внутри целевой страницы, чтобы вызвать отображение ее содержимого. Это, в свою очередь, означает, что содержимое страниц должно быть предварительно загружено, чтобы цель обновления была доступна. Скорее всего, это ошибка в текущей реализации мобильных элементов управления, но это может быть БОЛЬ!

Метод 2:
Чтобы отслеживать страницы И выбранный элемент без вышеуказанных побочных эффектов. Не добавляйте обработчик событий. Вместо этого... создайте элемент списка таким образом, чтобы "id" для элемента добавлялся в качестве параметра для атрибута moveTo.

пример:

<xe:djxmRoundRectList id="menuList">
  <xp:repeat value="#{compositeData.view.listItems}"
    var="listItem" indexVar="menuIndex" id="listRepeat" rows="999">
    <xe:djxmLineItem id="listItem"
      label="#{listItem.label}" moveTo="#{compositeData.view.moveTo}&amp;id=#{listItem.id}&amp;clear=true"
      rightText="#{listItem.rightText}">
    </xe:djxmLineItem>
  </xp:repeat>
</xe:djxmRoundRectList>

Следующий код можно добавить в нижнюю часть страницы, чтобы добавить прослушиватель событий для события перехода каждой страницы приложения.

<xp:scriptBlock id="scriptBlock1">
    <xp:this.value>
        <![CDATA[XSP.addOnLoad(function(){
          dijit.registry.byClass("extlib.dijit.mobile.View").forEach(function(widget, index, hash){
          dojo.connect(widget, "onBeforeTransitionOut", function(moveTo, dir, transition, context, method){
          var deferred = adminService.setMoveTarget(moveTo);
        });
      });
    });
  ]]>
  </xp:this.value>
</xp:scriptBlock>

Обработчик событий вызывает jsonRpcService, который передает детали компоненту (до того, как произойдет переход страницы).

<xe:jsonRpcService id="jsonRpcService1" serviceName="adminService"
  state="true">
  <xe:this.methods>
    <xe:remoteMethod name="setMoveTarget"
      script="AdminSession.setMoveTarget(moveTo);return true;">
      <xe:this.arguments>
        <xe:remoteMethodArg name="moveTo"></xe:remoteMethodArg>
        </xe:this.arguments>
      </xe:remoteMethod>    
  </xe:this.methods>
</xe:jsonRpcService>

тогда метод setMoveTarget() в bean-компоненте AdminSession должен иметь возможность анализировать параметры для идентификации выбранного элемента, а также отслеживать переход страницы.

Примечание: добавление clear=true — это способ убедиться, что pageContent страницы сбрасывается только при переходе на страницу вперед, а не при возврате на ту же страницу.

02.07.2013
  • ps: кредит на образец кода принадлежит Натану Фриману, который разработал проект, над которым мы работаем вместе. 02.07.2013
  • У меня техника №1 работает достаточно хорошо, спасибо. Я немного обновлю код решения 02.07.2013

  • 2

    Итак, вот код модифицированного подхода, который работает с этим предостережением...

    1. Представления классифицируются только по первому столбцу, хотя это может и не понадобиться. На странице используется «Фильтр по значению столбца» для отображения выбранных документов. Это было связано с тем, что элемент управления повтором для subcatAppPage не нашел бы несколько значений, если бы я не удалил категоризацию из представления.

    2. Я использовал элемент управления dataContext на странице для определения отображаемых представлений. Это требует большей сложности, но это работает на данный момент:

      <xp:this.dataContexts>
        <xp:dataContext
          var="viewListItems">
          <xp:this.value><![CDATA[#{javascript:
            try {
              var returnVal = [];
              returnVal.push({name:"Issues by Assigned To By Client", alias:"ByAssignedToClient", cats:["AssignedTo","Client"]});
              returnVal.push({name:"Issues by Assigned To By Module", alias:"ByAssignedToType", cats:["AssignedTo","Type"]});
              returnVal.push({name:"Issues by Client By Assigned To", alias:"ByClientAssignedTo", cats:["Client","AssignedTo"]});
              returnVal.push({name:"Issues by Client By Module", alias:"ByClientType", cats:["Client","Type"]});
              return returnVal;
            } catch(e) {
               _dump(e);
            }
          }]]></xp:this.value>
        </xp:dataContext>
      </xp:this.dataContexts>
      

    А вот и мобильное управление:

    <xe:singlePageApp
            id="singlePageApp1"
            selectedPageName="mhome">
            <xe:appPage
                id="homeAppPage1"
                pageName="mhome">
                <xe:djxmHeading
                    id="djxmHeading1"
                    label="Home">
                </xe:djxmHeading>
                <xe:djxmRoundRectList id="djxmRoundRectList1">
                    <xp:repeat
                        id="repeat3"
                        rows="10"
                        var="listItem"
                        indexVar="liidx"
                        value="#{viewListItems}">
                        <xe:djxmLineItem
                            id="djxmLineItem5"
                            moveTo="selectCat"
                            label="#{javascript:listItem.name;}">
                            <xp:eventHandler
                                event="onClick"
                                submit="true"
                                refreshId="selectCatPagePanel"
                                refreshMode="partial">
                                <xp:this.action>
                                    <xp:actionGroup>
                                        <xp:executeScript script="#{javascript:sessionScope.m_selectedView = listItem;}"></xp:executeScript>
                                    </xp:actionGroup>
                                </xp:this.action>
                            </xp:eventHandler>
                        </xe:djxmLineItem>
                    </xp:repeat>
                </xe:djxmRoundRectList>
            </xe:appPage>
            <xe:appPage
                id="categoryAppPage2"
                pageName="selectCat"
                resetContent="true"
                preload="true">
                <xp:panel id="selectCatPagePanel">
                    <xp:this.data>
                        <xp:dominoView var="view1">
                            <xp:this.viewName><![CDATA[#{javascript:
    try{
        var ssview = sessionScope.m_selectedView;
        if(ssview == null) return "ByClientAssignedTo";
        return ssview.alias;
    } catch(e) {
        return "ByClientAssignedTo";
    }}]]></xp:this.viewName>
                        </xp:dominoView>
                    </xp:this.data>
                    <xe:djxmHeading
                        id="djxmHeading2"
                        moveTo="mhome"
                        back="back">
                        <xe:this.label><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "Select something";
    return "Select " + ssview.cats[0];
    }]]></xe:this.label>
                    </xe:djxmHeading>
                    <xp:text
                        escape="true"
                        id="computedField3">
                        <xp:this.value><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "View is nothing"
    return "View is: " + ssview.name;
    }]]></xp:this.value>
                    </xp:text>
                    <xe:djxmRoundRectList id="djxmRoundRectList2">
                        <xp:repeat
                            id="repeat1"
                            rows="30"
                            value="#{javascript:view1.getColumnValues(0);}"
                            var="catvalue"
                            indexVar="catidx">
                            <xe:djxmLineItem
                                id="djxmLineItem3"
                                label="#{javascript:catvalue}"
                                moveTo="selectSubcat">
                                <xp:eventHandler
                                    event="onClick"
                                    submit="true"
                                    refreshId="selectSubCatPagePanel"
                                    refreshMode="partial">
                                    <xp:this.action><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    ssview.selectedCat = catvalue
    sessionScope.m_selectedView = ssview;
    }]]></xp:this.action>
                                </xp:eventHandler>
                            </xe:djxmLineItem>
                        </xp:repeat>
                    </xe:djxmRoundRectList>
                </xp:panel>
            </xe:appPage>
            <xe:appPage
                id="subcatAppPage3"
                pageName="selectSubcat"
                preload="true"
                resetContent="true">
                <xp:panel id="selectSubCatPagePanel">
    
                    <xe:djxmHeading
                        id="djxmHeading3"
                        moveTo="selectCat"
                        back="back">
                        <xe:this.label><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "Select something";
    return "Select " + ssview.cats[1];}]]></xe:this.label>
                    </xe:djxmHeading>
                    <xp:text
                        escape="false"
                        id="computedField1">
                        <xp:this.value><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "blah blah";
    "View is: " + ssview.name +
    "<br/>" + ssview.cats[0] + ": " + ssview.selectedCat;
    }]]></xp:this.value>
                    </xp:text>
                    <xe:djxmRoundRectList id="djxmRoundRectList3">
                        <xp:repeat
                            id="repeat2"
                            rows="10"
                            var="subcatValue"
                            indexVar="catidx">
                            <xp:this.value><![CDATA[#{javascript://var vals = @Unique(view2.getColumnValues(1));
    //vals.sort();
    var vals = [];
    try{
        var ssview = sessionScope.m_selectedView;
        if(ssview==null) return vals;
        vals = @DbLookup("", ssview.alias, ssview.selectedCat, 2);
        return @Unique(vals);
    } catch(e) {
        return vals;
    }
    return vals;}]]></xp:this.value>
                            <xe:djxmLineItem
                                id="djxmLineItem1"
                                label="#{javascript:subcatValue}"
                                moveTo="showView">
                                <xp:eventHandler
                                    event="onClick"
                                    submit="true"
                                    refreshId="showViewPagePanel"
                                    refreshMode="partial">
                                    <xp:this.action><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return;
    ssview.selectedSubcat = subcatValue
    sessionScope.m_selectedView = ssview;
    }]]></xp:this.action>
                                </xp:eventHandler>
                            </xe:djxmLineItem>
                        </xp:repeat>
                    </xe:djxmRoundRectList>
                </xp:panel>
            </xe:appPage>
            <xe:appPage
                id="viewAppPage4"
                pageName="showView"
                preload="true"
                resetContent="true">
                <xp:panel id="showViewPagePanel">
                    <xe:djxmHeading
                        id="djxmHeading4"
                        moveTo="selectSubcat"
                        back="back">
                        <xe:this.label><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "asdaasd";
    ssview.name;}]]></xe:this.label>
                    </xe:djxmHeading>
                    <xp:text
                        escape="false"
                        id="computedField2">
                        <xp:this.value><![CDATA[#{javascript:
    var ssview = sessionScope.m_selectedView;
    if(ssview == null) return "blah blah";
    "View is: " + ssview.name +
    "<br/>" + ssview.cats[0] + ": " + ssview.selectedCat +
    "<br/>" + ssview.cats[1] + ": " + ssview.selectedSubcat;
    }]]></xp:this.value>
                    </xp:text>
                    <xe:dataView
                        id="dataView1"
                        columnTitles="true">
                        <xe:this.data>
                            <xp:dominoView var="view4">
                                <xp:this.viewName><![CDATA[#{javascript:
    try{
        var ssview = sessionScope.m_selectedView;
        if(ssview == null) return "ByClientAssignedTo";
        return ssview.alias;
    } catch(e) {
        return "ByClientAssignedTo";
    }}]]></xp:this.viewName>
                                <xp:this.keys><![CDATA[#{javascript:try{
        var ssview = sessionScope.m_selectedView;
        if(ssview == null) return ["xxx","yyy"];
        if(!ssview.selectedCat) return ["xxx"];
        if(!ssview.selectedSubcat) return [ssview.selectedCat]
        return [ssview.selectedCat, ssview.selectedSubcat];
        //return ssview.selectedCat;
    } catch(e) {
        return ["xxx","yyy"];
    }}]]></xp:this.keys>
                            </xp:dominoView>
                        </xe:this.data>
                        <xe:this.summaryColumn>
                            <xe:viewSummaryColumn
                                columnName="Subject"
                                columnTitle="Subject"
                                contentType="text">
                            </xe:viewSummaryColumn>
                        </xe:this.summaryColumn>
                    </xe:dataView>
                </xp:panel>
            </xe:appPage>
        </xe:singlePageApp>
    

    Удачного кодирования!

    Новички

    02.07.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..