Просмотр без отображения данных модели из Манифеста.формат JSON



Я пытаюсь настроить файл дескриптора приложения (manifest.в JSON), чтобы включать в себя название модели, "входы" в "модели" объекта. Насколько я понимаю, после этого модель должна быть доступна во всем приложении, если указан правильный путь (см. XML-представление).



Причина, по которой я хотел бы настроить этот манифест.json - это потому, что здесь рекомендуется настраивать все модели.



В контроллере я хотел бы получить и затем установить модель "inputs", определенную в манифесте.формат JSON --но как это можно сделать?



Манифест.json (где я настроил модель' inputs')



{
"_version": "1.1.0",
"sap.app": {
"_version": "1.1.0",
"id": "pricingTool",
"type": "application",
"applicationVersion": {
"version": "1.0.0"
},
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"ach": "ach",
"resources": "resources.json",
"sourceTemplate": {
"id": "ui5template.basicSAPUI5ApplicationProject",
"version": "1.30.3"
},
},

"sap.ui": {
"_version": "1.1.0",
"technology": "UI5",
"icons": {
"icon": "",
"favIcon": "",
"phone": "",
"phone@2": "",
"tablet": "",
"tablet@2": ""
},
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
},
"supportedThemes": [
"sap_hcb",
"sap_bluecrystal"
]
},

"sap.ui5": {
"_version": "1.1.0",
"rootView": {
"viewName": "pricingTool.view.Main",
"type": "XML"
},
"dependencies": {
"minUI5Version": "1.30.0",
"libs": {
"sap.ui.core": {},
"sap.m": {},
"sap.ui.layout": {}
}
},
},
"contentDensities": {
"compact": true,
"cozy": true
},
"models": {
"inputs": {
"type": "sap.ui.model.json.JSONModel",
"uri": "model/inputs.json"
},

},
}


Главное.контроллер.js (где модель 'inputs' должна быть установлена из файла манифеста)



sap.ui.define([
'jquery.sap.global',
'sap/ui/core/mvc/Controller',
'sap/ui/model/json/JSONModel',
'sap/ui/model/Filter',
'sap/ui/model/FilterOperator',
'sap/m/MessageToast',
'pricingTool/model/viewControls',
'pricingTool/model/formatter',
'pricingTool/model/Utility',
'sap/ui/core/util/Export',
'sap/ui/core/util/ExportTypeCSV',
],

function (jQuery, Controller, JSONModel, Filter, FilterOperator, MessageToast, viewControls, formatter, Utility, Export, ExportTypeCSV) {

"use strict";

var mainController = Controller.extend("pricingTool.controller.Main", {

onInit: function(oEvent) {

//define named/default model(s)
var inputs = new JSONModel("./model/inputs.json");

//set model(s) to current xml view
this.getView().setModel(inputs, "inputs");

//this is one solution I have tried, but doesn't do anything:
// this.getView().setModel(this.getOwnerComponent().getModel("inputs"), "inputs");

//another solution I have tried:
//var inputs = this.getModel('input') <--I was hoping this would find the inputs defined in the manifest.json, but this doesn't work either
// this.getView().setModel(inputs, "inputs");


},

...


Входы.json



{
"propA" : "testVal"
}


XML View



<Button text="{inputs>propA}"></Button>


Компоненты.js (Не уверен, что делать в компоненте.js)



sap.ui.define([
'sap/ui/core/UIComponent'
],
function(UIComponent) {
"use strict";


var Component = UIComponent.extend("pricingTool.Component", {

metadata : {

metadata : {
manifest: "json"
},
rootView : "pricingTool.view.Main",
dependencies : {
libs : [
"sap.m",
"sap.ui.layout"
]
},
config : {
sample : {
files : [
"Main.view.xml",
"Main.controller.js"
]
}
}
},

init : function () {
// call the init function of the parent
UIComponent.prototype.init.apply(this, arguments);

}
});

return Component;

});


Проблема в том, что свойство модели ("propA") не отображается, когда я тестирую его на кнопка. Может ли кто-нибудь сказать мне, почему модель не отображается в приложении?



Обобщающий Вопрос



Как я могу определить модель в манифесте.json, а затем установите эту модель в контроллере, чтобы я мог использовать ее в своем xml-представлении?

621   3  

3 ответов:

Попробуйте поставить косую черту перед именем свойства...

<Button text="{inputs>/propA}"></Button>

...и обновите файл манифеста, чтобы определение модели указывало на источник данных, определенный в sap.приложение выглядит следующим образом...

{
"_version": "1.1.0",
"sap.app": {
    "_version": "1.1.0",
    "id": "pricingTool",
    "type": "application",
    "applicationVersion": {
        "version": "1.0.0"
    },
    "title": "{{appTitle}}",
    "description": "{{appDescription}}",
    "ach": "ach",
    "resources": "resources.json",
    "sourceTemplate": {
        "id": "ui5template.basicSAPUI5ApplicationProject",
        "version": "1.30.3"
    },
    "dataSources": {
        "inputsData": {
            "type" : "JSON",
            "uri": "model/inputs.json"
        }
    }
},

"sap.ui": {
    "_version": "1.1.0",
    "technology": "UI5",
    "icons": {
        "icon": "",
        "favIcon": "",
        "phone": "",
        "phone@2": "",
        "tablet": "",
        "tablet@2": ""
    },
    "deviceTypes": {
        "desktop": true,
        "tablet": true,
        "phone": true
    },
    "supportedThemes": [
        "sap_hcb",
        "sap_bluecrystal"
    ]
},

"sap.ui5": {
    "_version": "1.1.0",
    "rootView": {
        "viewName": "pricingTool.view.Main",
        "type": "XML"
    },
    "dependencies": {
        "minUI5Version": "1.30.0",
        "libs": {
            "sap.ui.core": {},
            "sap.m": {},
            "sap.ui.layout": {}
        }
    },
    "contentDensities": {
        "compact": true,
        "cozy": true
    },
    "models": {
        "products": {
            "type": "sap.ui.model.json.JSONModel",
            "uri":  "model/products.json"
        },
        "inputs": {
                    "type": "sap.ui.model.json.JSONModel",
                    "dataSource" : "inputsData"
        }
      }
    }
}

...измените свой компонент.файл js, чтобы указать на файл манифеста...

sap.ui.define([
        'sap/ui/core/UIComponent'
    ],
    function(UIComponent) {
    "use strict";


    var Component = UIComponent.extend("pricingTool.Component", {

        metadata : {
            manifest: "json",
        },

        init : function () {
            // call the init function of the parent
            UIComponent.prototype.init.apply(this, arguments);

        }
    });
});

... и удалите логику onInit в вашем контроллере, чтобы установить модель (это обрабатывается компонентом)

Те модели, которые вы определяете в манифесте.JSON-файл создается в контексте компонента (если ваше приложение основано на компоненте). Чтобы сделать его доступным в XML-представлении, вы должны получить его из компонента и затем присоединить к представлению. Фрагмент кода, который вы можете использовать в событии контроллера onInit, выглядит следующим образом:

this.getView().setModel(this.getOwnerComponent().getModel("<your_model_name>"), "<your_model_name>");

Если вы используете стандартный шаблон, то, скорее всего, у вас есть BaseController в качестве предка, в этом случае код может выглядеть короче:

this.setModel(this.getComponentModel("<your_model_name>"), "<your_model_name>");

Вот минимальный пример того, чего вы хотите достичь: https://embed.plnkr.co/l1XF5O/

  • модели, определенные в манифесте.джсон (он же. "дескриптор приложения") будет установлен на компонент (начиная с версии v1. 30).
  • Если используется дескриптор, то почти все свойства вашего компонента metadata, отличные от manifest: "json", являются устаревшими и их следует избегать. Устаревшие свойства перечислены здесь.
  • представления (и их элементы управления внутри) внутри корневого представления, созданного ваш компонент автоматически наследует модели от компонента. Таким образом, установка моделей для вашего представления явно больше не требуется. Ваше представление уже знает модель, которая установлена для компонента.*
  • синтаксис привязки должен использоваться правильно в соответствии с вашей ситуацией.:
    • используйтеотносительный синтаксис привязки (modelName>property) только в том случае, если родительский элемент управления уже имеет контекстную привязку (например, родительский элемент управления использует привязку агрегации или привязку элемента).
    • в других случаях, используйтеабсолютный синтаксис привязки. Он начинается с косой черты (modelName>/property), так что элемент управления не ищет контекст привязки своего родителя.

* хотя модель, которая установлена на компоненте, может быть легко использована в XMLView, получение модели компонента вызовом view.getModel внутри обработчика onInit вернет undefined. Подробнее об этом: https://stackoverflow.com/a/43941380/5846045

Comments

    Ничего не найдено.