Data binding 视图未显示Manifest.json中的模型数据

Data binding 视图未显示Manifest.json中的模型数据,data-binding,sapui5,manifest,Data Binding,Sapui5,Manifest,我正在尝试设置我的应用描述符文件(manifest.json),以便在其“models”对象中包含一个命名模型“inputs”。根据我的理解,在这样做之后,如果提供了正确的路径(请参见XML视图),该模型应该可以在整个应用程序中使用 我之所以要设置这个manifest.json,是因为在这里配置所有模型是一种最佳实践 在控制器中,我想获取并设置manifest.json中定义的“inputs”模型——但是如何实现呢 manifest.json(其中我配置了“输入”模型) Main.control

我正在尝试设置我的应用描述符文件(manifest.json),以便在其“models”对象中包含一个命名模型“inputs”。根据我的理解,在这样做之后,如果提供了正确的路径(请参见XML视图),该模型应该可以在整个应用程序中使用

我之所以要设置这个manifest.json,是因为在这里配置所有模型是一种最佳实践

在控制器中,我想获取并设置manifest.json中定义的“inputs”模型——但是如何实现呢

manifest.json(其中我配置了“输入”模型)

Main.controller.js(其中应从清单文件设置“输入”模型)

XML视图

<Button text="{inputs>propA}"></Button>
问题是,当我在按钮控件上测试模型属性(“propA”)时,它没有显示出来。有人能告诉我为什么应用程序中没有显示模型吗

总结问题

{
    "propA" : "testVal"
}

如何在manifest.json中定义一个模型,然后在控制器中设置该模型,以便在xml视图中使用它?

尝试在属性名称前加一个正斜杠

<Button text="{inputs>/propA}"></Button>
…更改Component.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逻辑以设置模型(这由组件处理)

您在manifest.json文件中定义的模型是在组件上下文中创建的(如果您的应用程序基于组件)。要使它在XML视图中可用,您必须从组件获取它,然后附加到视图。可以在onInit控制器事件中使用的代码段如下所示:

this.getView().setModel(this.getOwnerComponent().getModel("<your_model_name>"), "<your_model_name>");
this.getView().setModel(this.getOwnerComponent().getModel(“”,”);
如果您使用的是标准模板,那么很可能您有一个BaseController作为祖先,在这种情况下,代码看起来会更短:

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

以下是您希望实现的一个简单示例:

  • manifest.json(又名“app descriptor”)中定义的模型将被设置为组件(从v1.30开始)
  • 如果使用描述符,除了
    清单:“json”
    之外,组件的
    元数据的几乎所有属性都不推荐使用,应该避免使用。将列出不推荐使用的属性
  • 组件实例化的根视图中的视图(及其内部控件)自动从组件继承模型。因此,不再需要显式地为视图设置模型。您的视图已经知道设置为组件的模型*
  • 应根据您的情况正确使用绑定语法:
    • 仅当父控件已具有上下文绑定(例如,父控件使用聚合绑定或元素绑定)时,才使用相对绑定语法(
      modelName>property
    • 在其他情况下,使用绝对绑定语法。它以斜杠(
      modelName>/property
      )开头,这样控件就不会查找其父控件的绑定上下文


*尽管在组件上设置的模型可以在XMLView中无缝使用,但通过调用onInit处理程序中的
view.getModel
来检索组件模型将返回
undefined
。更多信息:

啊,是的,您需要稍微调整清单配置,以便您的uri位于sap.app.dataSources下,将更新应答器清单结构需要稍微更正,sap.ui5对象在依赖项之后结束,因此无法提取模型…将更新应答器是,它只是移动了一个花括号的位置。。。您是否尝试过使用当前的json?已剪切并粘贴到现有应用程序的清单中,并且它正在尝试加载model/inputs.json,因此模型正在初始化。是的,由于某些原因,它仍然没有显示数据。已更新我的响应,以包括对组件的一些更改,因为它当前未配置为查看您的清单文件。您将需要根据我的响应的第一部分更改视图中的绑定。因为我对整个清单/组件配置不熟悉,我的印象是,通过在manifest.json中定义模型,整个应用程序都可以访问该模型。如果我错了,请纠正我的错误,但这仍然是正确的,但现在我只需要在Component.js中设置manifest.json中定义的每个模型?代码应该在视图控制器中(在onInit事件中),而不是在组件中。js感谢您的回复,我尝试了这两个代码,并将它们都包含在main.controller.js中。第一个什么也不做;第二个BaseController解决方案返回错误getComponentModel不是函数。请参阅我提供的“总结问题”,以确保我们与我遇到的问题处于同一页:)
{
"_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"
        }
      }
    }
}
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);

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