Почему SAPUI5 загружает подобный фрагмент несколько раз? - PullRequest
5 голосов
/ 18 октября 2019

У меня есть фрагмент XML, и я использую его в нескольких местах в представлении XML.

<IconTabFilter text="ABC" key="1" icon="sap-icon://alphabetical-order">
    <content>
        <Table id="table1" width="auto" items="{path:'/ContactSet',parameters:{expand:'BusinessAddress,HomeAddress,OtherAddress,Photo'},filters:[{path:'Surname',operator:'StartsWith',value1:'A'},{path:'Surname',operator:'StartsWith',value1:'B'},{path:'Surname',operator:'StartsWith',value1:'C'}]}" noDataText=" {worklistView>/tableNoDataText}" busyIndicatorDelay="{worklistView>/tableBusyDelay}" growing="true" growingScrollToLoad="true" updateFinished="onUpdateFinished">
            <headerToolbar>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesHeader" type="XML"/>
            </headerToolbar>
            <columns>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesColumns" type="XML"/>
            </columns>
            <items>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesRows" type="XML"/>
            </items>
        </Table>
    </content>
</IconTabFilter>
<IconTabSeparator icon="sap-icon://process"/>
<IconTabFilter text="DEF" key="2" icon="sap-icon://alphabetical-order">
    <content>
        <Table id="table2" width="auto" items="{path:'/ContactSet',parameters:{expand:'BusinessAddress,HomeAddress,OtherAddress,Photo'},filters:[{path:'Surname',operator:'StartsWith',value1:'D'},{path:'Surname',operator:'StartsWith',value1:'E'},{path:'Surname',operator:'StartsWith',value1:'F'}]}" noDataText="{worklistView>/tableNoDataText}" busyIndicatorDelay="{worklistView>/tableBusyDelay}" growing="true" growingScrollToLoad="true" updateFinished="onUpdateFinished">
            <headerToolbar>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesHeader" type="XML"/>
            </headerToolbar>
            <columns>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesColumns" type="XML"/>
            </columns>
            <items>
                <core:Fragment fragmentName="de.cimt.cimply.AddressBook.view.worklist.tablesRows" type="XML"/>
            </items>
        </Table>
    </content>
</IconTabFilter>

Но представление загружается слишком долго, особенно в WEBIDE.

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

Show how SAPUI5 loads xml file

Вопрос в том, как я могу улучшить производительность?

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

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

В этом случае нет необходимости менять код. SAP Web IDE / SCP использует концепцию App Cache Buster из коробки, которая выбирает ресурсы приложения (например, фрагменты) из кэша браузера, если эти ресурсы не были изменены ранее.

См. Пример снимка экрана ниже:

Дано

  • Код:

    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    <core:Fragment fragmentName="demo.view.fragment.MyFragment" type="XML" />
    
  • атрибут URL sap-ui-appCacheBuster=..., которыйWeb IDE автоматически добавляется при запуске приложения (описывает, где находится sap-ui-cachebuster-info.json)
  • Если открыт devtool: Отключить кэш Не проверено <- вероятно, это все еще было активировано в вашем случае </li>

Результат

Loading SAPUI5 application resources from the cache

Как видите, фрагменты (и другиересурсы) загружаются из дискового кэша вместо повторной выборки их снова и снова.

Кроме того, если приложение связано для конечной производственной среды, эти фрагменты не будут дажезапрашивается несколько раз, поскольку они, как правило, уже включены в пакетиль (например, Component-preload.js).


0 голосов
/ 22 октября 2019

Если вы запускаете ваше приложение не в среде веб-тестирования, то фрейменты должны загружаться из кеша.

Однако вы можете загрузить свой фрагмент в контроллер и использовать фабричные функции вместо шаблонов. Что-то вроде:

Вид:

<mvc:View controllerName="test.test.controller.View1" xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core" displayBlock="true" xmlns="sap.m">
<Shell id="shell">
    <App id="app">
        <pages>
            <Page id="page" title="{i18n>title}">
                <content>
                    <List  items="{ path: '/myList', factory: '.myListFactory' }"/>
                </content>
            </Page>
        </pages>
    </App>
</Shell>

в вашем контроллере:

    onInit: function () {

        this.getView().setModel(new JSONModel({
            "myList" : [{
                "Name": "Test1"
            }, {
                "Name": "Test2"
            }]
        }));


    },

    myListFactory: function (sId) {
        if(!this._myListFragment){
            this._myListFragment = new sap.ui.xmlfragment("test.test.view.myListFragment", this);
        }
        return this._myListFragment.clone(sId);
    }

фрагмент:

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
<StandardListItem icon="sap-icon://warning" title="{Name}" />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...