You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将两个模型绑定到一个控件?StandardTile双数据填充问题

解决StandardTile绑定两个SOAP调用返回值的问题

这种情况我之前也遇到过,核心问题在于如果直接用多个未命名的XMLModel,后面的模型会覆盖掉前面的默认模型,导致你看到重复的数字。这里提供两种靠谱的解决方案,你可以根据自己的习惯选择:

方案一:用单个JSONModel统一管理数据(推荐)

这种方式更灵活,把两个接口返回的数字都存在一个JSONModel里,绑定的时候直接指定不同的字段路径就行,不会冲突。

步骤1:初始化JSONModel并绑定到视图

在控制器的onInit方法里创建一个空的JSONModel,给它起个名字方便后续绑定:

onInit: function () {
  // 创建存储两个数字的JSONModel
  const oTileDataModel = new sap.ui.model.json.JSONModel({
    firstNumber: 0, // 初始化默认值
    secondNumber: 0
  });
  // 给模型起个唯一名称,避免和其他模型冲突
  this.getView().setModel(oTileDataModel, "tileData");

  // 发起两次SOAP请求
  this.fetchSOAPData("param1").then(num1 => {
    oTileDataModel.setProperty("/firstNumber", num1);
  }).catch(err => {
    console.error("获取第一个数字失败:", err);
  });

  this.fetchSOAPData("param2").then(num2 => {
    oTileDataModel.setProperty("/secondNumber", num2);
  }).catch(err => {
    console.error("获取第二个数字失败:", err);
  });
}

步骤2:封装SOAP请求方法

把SOAP调用封装成Promise,方便处理异步逻辑:

fetchSOAPData: function (param) {
  return new Promise((resolve, reject) => {
    // 构建你的SOAP请求XML,根据实际服务调整
    const soapRequest = `<?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <YourServiceMethod>
            <YourParam>${param}</YourParam>
          </YourServiceMethod>
        </soap:Body>
      </soap:Envelope>`;

    $.ajax({
      url: "你的SOAP服务地址",
      type: "POST",
      contentType: "text/xml; charset=utf-8",
      data: soapRequest,
      dataType: "xml",
      success: (response) => {
        // 解析SOAP响应,提取你需要的数字(根据实际响应结构调整)
        const numberText = $(response).find("YourResponseNumberNode").text();
        resolve(parseInt(numberText, 10)); // 转成数字类型
      },
      error: (error) => {
        reject(error);
      }
    });
  });
}

步骤3:视图里绑定属性

在XML视图的StandardTile中,通过模型名称指定绑定路径:

<StandardTile
  title="自定义标题"
  number="{tileData>/firstNumber}"
  numberUnit="{tileData>/secondNumber}"
/>

方案二:使用命名的XMLModel

如果你还是想用XMLModel,记得给每个模型起不同的名称,绑定的时候明确指定模型名,就不会覆盖了:

控制器代码

onInit: function () {
  // 第一个XMLModel,获取第一个数字
  const oModel1 = new sap.ui.model.xml.XMLModel();
  this.getView().setModel(oModel1, "model1");
  oModel1.loadData(
    "你的SOAP服务地址",
    this.buildSOAPRequest("param1"), // 构建带param1的请求XML
    true,
    "POST",
    false,
    false,
    { "Content-Type": "text/xml; charset=utf-8" }
  );

  // 第二个XMLModel,获取第二个数字
  const oModel2 = new sap.ui.model.xml.XMLModel();
  this.getView().setModel(oModel2, "model2");
  oModel2.loadData(
    "你的SOAP服务地址",
    this.buildSOAPRequest("param2"), // 构建带param2的请求XML
    true,
    "POST",
    false,
    false,
    { "Content-Type": "text/xml; charset=utf-8" }
  );
}

// 构建SOAP请求的方法,和方案一类似
buildSOAPRequest: function (param) {
  return `<?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <YourServiceMethod>
          <YourParam>${param}</YourParam>
        </YourServiceMethod>
      </soap:Body>
    </soap:Envelope>`;
}

视图绑定

<StandardTile
  title="自定义标题"
  number="{model1>/YourResponseRoot/NumberNode}"
  numberUnit="{model2>/YourResponseRoot/NumberNode}"
/>

两种方案里,方案一的JSONModel方式更推荐,因为它的结构更直观,后续如果要扩展其他数据也更方便,而且单个模型管理起来更简单。

内容的提问来源于stack exchange,提问作者Marco Hernández

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:54:41