Sapui5 为什么模型中的数据没有绑定到视图?

Sapui5 为什么模型中的数据没有绑定到视图?,sapui5,Sapui5,我有一个控制器。我在其中定义数据并将其设置为模型。稍后,我想将此模型的数据绑定到视图中的列表控件。 问题:但问题是数据没有显示在绑定到的相应控件中。谁能帮我做错事吗 以下是我的控制器代码和我的视图: App.view.xml <mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core" disp

我有一个控制器。我在其中定义数据并将其设置为模型。稍后,我想将此模型的数据绑定到视图中的列表控件。 问题:但问题是数据没有显示在绑定到的相应控件中。谁能帮我做错事吗

以下是我的控制器代码和我的视图:

App.view.xml

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core"
displayBlock="true" controllerName="opensap.examples.controller.App" height="100%">
<Page title="List Page">
    <content>
        <List headerText="{/question}" id="myList" items="{ path: '/answers' }">
            <items>
                <InputListItem label="{answerText}">
                    <CheckBox></CheckBox>
                </InputListItem>
         </List>
        <Button press="load" text="Click Me"></Button>
    </content>
</Page></mvc:View>

事实上,我们需要多个模型,我们正在为我们的模型命名。您将受益于更高的一致性和更好的可读性,并且可以完全控制应用程序。如果以这种方式绑定模型,则必须使用元素绑定(请参见:)

还有一件事:您忘记了“,”将onInit与load分离;)我为您修复了以下代码

最后一件事:D如果你在一个函数中声明了一个变量,你不能在另一个函数中访问,因为作用域发生了变化(请参见:),你需要在一个全局作用域中访问你的模型!您可以将模型绑定到此,或者通过引用名称访问模型

loki现在希望动态显示答案(参见本文下面的评论)。要实现这一点,您需要使用聚合绑定(请参阅:)。聚合绑定允许您通过JSON对象“循环”。您可能会在
-元素中看到差异:)

App.view.xml

App.controller.js
sap.ui.define([
“sap/ui/core/mvc/Controller”,
“sap/ui/model/json/JSONModel”],函数(控制器,JSONModel){
变量oData={
“问题”:“你喜欢以下哪种宠物?”,
“答案”:[
{“回答文字”:“猫”},
{“回答文字”:“兔子”},
{“回答文字”:“狗”},
{“回答文字”:“仓鼠”}
]
};
//编辑

var oModel;//嗨,corax,,,'我在stackoverflow上粘贴代码时忘记了,我的代码中有它,或者它会导致编译错误。谢谢你的编辑。你是说我应该命名我的模型并尝试一下吗?还感谢你提供的链接,你建议我发现它很有用。是的,请尝试一下。这段代码还没有经过测试,但是如果有任何错误,我将进行编辑。请确保备份您当前的代码(!!!!):)我希望将答案保留为一个集合,该集合由answerText作为键组成,并具有我之前定义的不同值。应根据answerText在answers集合中的数量动态显示,它应显示许多InputListItems,例如:对于answers集合中的1个项目,如果有,则仅显示1个inputlistitem2然后2 inputlistitem等等。请为此打开另一个问题;)您需要一种不同的方法。(聚合绑定,请参阅:)。哦,是的,这就是我试图实现聚合绑定的目的。感谢您提供的链接。我应该在新问题中指定我应该打开的内容?s
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel"], function(Controller, JSONModel) {

var oData = {
    "question": "Which pet do you like from the following?",
    "answers": [{
        "answerText": "Cats"
    }, {
        "answerText": "Rabbits"
    }, {
        "answerText": "Dogs"
    }, {
        "answerText": "Hamsters"
    }]
};

var oModel;


Controller.extend("opensap.examples.controller.App", {

    onInit: function() {
         oModel = new JSONModel();
         oModel.setData(oData);
         console.log(oModel);
    }, load: function() {
        console.log(oModel);
    }
}); });
<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form" xmlns:core="sap.ui.core"
displayBlock="true" controllerName="opensap.examples.controller.App" height="100%">
<Page title="List Page">
    <content>
        <List headerText="{myModel>/question}" items="{myModel>/answers}">
            <items >
                <InputListItem label="{myModel>answerText}"> <!-- Aggregation Binding -->
                    <CheckBox></CheckBox>
                </InputListItem>
         </List>
        <Button press="load" text="Click Me"></Button>
    </content>
</Page>
</mvc:View>
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel"], function(Controller, JSONModel) {

var oData = {
    "question": "Which pet do you like from the following?",
    "answers": [
          {"answerText": "Cats"}, 
          {"answerText": "Rabbits"},
          {"answerText": "Dogs"},
          {"answerText": "Hamsters"}
     ]
 };

// edit
var oModel; // <-- might work, but it is not a good practice @sapui5 :)


Controller.extend("opensap.examples.controller.App", {

    onInit: function() {
         oModel = new sap.ui.model.json.JSONModel();
         this.setModel(oModel, "myModel");
         oModel.setData(oData);
         console.log(oModel);
    },

    load: function() {
         // if you bind your model to the window-context (this)
         //console.log(this.oModel.getData());
         var myModel = this.getView().getModel("myModel");
         console.log(myModel.getData());
         // I always use ^-this-^ approach.
    }
}); });