如何在我的控制器中获取JSONModel的属性?

时间:2017-05-12 09:14:55

标签: sapui5

我需要在控制器中检索我的JSONModel的属性。 方案如下:

我有一个“问卷”模型(questionnaire.json),其中包含问题和答案。然后我有一个控制器(App.controller.js)。 在这个控制器中,我在 onInit 中创建了另一个名为“currentQuestion”的模型,因为我需要实现一个场景,当用户点击下一个按钮时应该加载下一个问题。 我试图获得我的“问卷”模型的属性,但我面临一个错误:

  

无法读取未定义的'getProperty'的属性。

您可以在此处查看模型数据和我的控制器:

questionnaire.json

{
    "data": [{
        "question": "Which pet do you like from the following?",
        "answers": ["Cats", "Rabbits", "Dogs", "Hamsters"],
        "correct": 1
    }, {
        "question": "Which pet do you prefer from the following?",
        "answers": ["Cats", "Dogs"],
        "correct": 1
    }, {
        "question": "What food brand does your pet eat?",
        "answers": ["Pedigree", "Catfood", "Rabbitfood", "HamstersFood"],
        "correct": 1
    }]
}

App.controller.js

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "sap/ui/model/json/JSONModel"
], function(Controller, JSONModel){

    Controller.extend("opensap.onlinequestionnaire.controller.App", {
        onInit: function() {
            this.questionSetUp();
            this.getView().setModel(new JSONModel({
                    index: false,
                    question: {}
            }), "currentQuestion");

            var oCurrentQuestionModel = this.getView().getModel("currentQuestion");
            var oQuestionModel = this.getView().getModel("questionnaire");
            var iCurrentIndex = oCurrentQuestionModel.getProperty("/index");
            var oQuestion = oQuestionModel.getProperty("/data/0/question");
            console.log(oQuestion);
            console.log(iCurrentIndex);
            iCurrentIndex = iCurrentIndex ? ++iCurrentIndex : 0;
            console.log(iCurrentIndex);
        }
    });
});

当我尝试质疑oQuestion中的属性时,它会抛出错误。如何获取第0个元素的问题属性的值?

3 个答案:

答案 0 :(得分:1)

  

我做错的另一件事是我试图在init中获得这个模型。 [src]

不幸的是,是的。这实际上是在这种情况下模型未定义的主要原因。但不是因为模型没有加载。 我们知道应用程序描述符(manifest.json)from the documentation中定义的模型are set to the component,并且这些模型会传播到组件的子项。因此,从任何控制器调用view.getModel都应无缝返回模型,因为它在组件上设置了全局但是: not obvious的一点是,只有使用相应的视图onInit,才能在任何控制器的view.getParent中检索组件上设置的模型,因为view doesn't know its parent yet in that state。在onInit中呼叫null会返回onInit。因此,组件模型“问卷”尚未传播到您的视图中。正如您已经这样做的那样,可以使用组件而不是视图this.getOwnerComponent().getModel("modelName")37 INFO 02:30.96 executePRScript(/tmp/IMC_01010000,prs.tws.script.cfg.unix): Enter. 38 INFO 02:32.52 PRS command used for execution:echo IMC=IMC >> /tmp/IMC_01010000/ codename.cfg&&chmod -R 755/tmp/IMC_01010000&&/tmp/IMC_01010000/prereq_checker.sh IMC detail outputDir=/tmp/IMC_01010000 39 ERROR 02:32.53 PRS job is finished. Results are not available. 40 WARNING 02:32.53 Error occurred while executing executePRScript. 中轻松检索此类组件模型,并输入错误

  

无法读取未定义

的'getProperty'的属性

消失了。

答案 1 :(得分:0)

方法setModel(oModel,sName?)为您的视图设置模型。在您的代码中,您将视图名称为“currentQuestion”的模型设置为包含来自questionnaire.json文件的数据的视图。您可以在变量oCurrentQuestionModel中获得此模型。 请尝试通过以下代码从此模型获取属性: oCurrentQuestionModel.getProperty("/data/0/question"); 在您的代码段中,不清楚oQuestionModel的定义位置。

答案 2 :(得分:0)

在你的情况下。我想你应该改变

var oQuestionModel = this.getView().getModel("questionnaire");

var oQuestionModel = this.getView().getModel();

因为您没有为模型命名,因此它成为默认模型。