导航时在控制器之间传递数据

时间:2018-02-16 17:27:07

标签: sapui5

我想在两个控制器之间传递数据(除了路由参数),我想知道正确的方法。

例如:当我导航到模式/order/{id}时,我在视图控制器中执行此操作:

this.getRouter().navTo("order", {
  id: sOrderId
});

我想传递额外的JSON对象,我不希望它成为路由参数的一部分。

在这种情况下我该怎么做?

- 编辑
想要添加我喜欢的内容

  

我希望将数据从主数据传递到详细信息。主页面和详细信息页面都分配了单独的路由模式。因此用户可以直接登陆主人或细节。当他们落在主人身上时 - 用户可以选择一堆细节项目,并导航到第一个细节项目,并从那里导航到他/她之前在主人选择的其他项目。所以我想要传递的是从主控制器到细节控制器的选择。

2 个答案:

答案 0 :(得分:2)

使用客户端模型

通常,数据分别存储在模型中,而不是分配给局部变量并传递它们。然后可以与可以访问模型的任何东西共享模型数据(例如,查看数据绑定)。 以下是客户端JSONModel的示例:

  1. 创建在父ManagedObject上设置的客户端JSONModel。例如。在Component上通过manifest.json:

    "sap.ui5": {
      "models": {
        "myModel": {
          "type": "sap.ui.model.json.JSONModel"
        }
      }
    }
    
  2. 控制器A 中,在导航前设置要传递的对象:

    const dataToPass = /*...*/
    this.getOwnerComponent().getModel("myModel").setProperty("/data", dataToPass);
    
  3. 控制器B 中,对传递的数据执行某些操作。例如。在patternMatched处理程序:

    onInit: function() {
      const orderRoute = this.getOwnerComponent().getRouter().getRoute("order");
      orderRoute.attachPatternMatched(this.onPatternMatched, this);
    },
    
    onPatternMatched: function() {
      /*Do sth with*/ this.getOwnerComponent().getModel("myModel").getProperty("/data");
    },
    
  4. 使用NavContainer(子)事件

    有几个与导航相关的事件,例如navigate,  BeforeHideBeforeShow等包含两个视图的视图 - 源视图(from)和目标视图(to)。

    您可以使用API​​ data来传递数据。 这是一个例子:

    1. 控制器A

      onInit: function() {
        this.getView().addEventDelegate({
          onBeforeHide: function(event) {
            const targetView = event.to;
            const dataToPass = /*...*/
            targetView.data("data", dataToPass);
          }
        }, this);
      },
      
    2. 控制器B

      onInit: function() {
        this.getView().addEventDelegate({
          onBeforeShow: function(event) {
            /*Do sth with*/ this.getView().data("data");
          }
        }, this);
      },
      
    3. 相关文档主题: Passing Data when Navigating

答案 1 :(得分:0)

您可以创建本地模型(通常是JSONModel)并将其设置为应用程序组件内部。

// inside Component.js
var model = new sap.ui.model.json.JSONModel({ foo: “bar”});
this.setModel(model);

在每个控制器内部,您可以使用

var model = this.getOwnerComponent().getModel();
console.log(model.getProperty(“/foo”));