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

Aus*_*tin 3 sapui5

我想在两个控制器之间传递数据(除了路由参数之外),并且我想知道执行此操作的正确方法。

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

this.getRouter().navTo("order", {
  id: sOrderId
});
Run Code Online (Sandbox Code Playgroud)

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

这种情况我该怎么办?

--edit
想添加我想通过此实现的目标

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

Bog*_*ann 5

注意:如果目的是将选定的键从主视图传递到详细视图,请参阅/sf/answers/3420940561/


使用客户端模型

通常,数据单独存储在模型中,而不是分配给局部变量并传递它们。然后,模型数据可以与任何可以访问模型的对象共享(例如数据绑定视图)。下面是一个客户端模型的示例 ( JSONModel):

  1. 创建一个JSONModel在父级上设置的ManagedObject。例如在组件上通过manifest.json

    "sap.ui5": {
      "models": {
        "myModel": {
          "type": "sap.ui.model.json.JSONModel"
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 控制器 A中,在导航之前设置要通过的对象:

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

    onInit: function() {
      const orderRoute = this.getOwnerComponent().getRouter().getRoute("order");
      orderRoute.attachPatternMatched(this.onPatternMatched, this);
    },
    
    onPatternMatched: function() {
      /*Do something with:*/this.getOwnerComponent().getModel("myModel").getProperty("/data");
    },
    
    Run Code Online (Sandbox Code Playgroud)

使用NavContainer(Child)事件

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

您可以利用 APIdata来传递数据。这是一个例子:

  1. 在控制器A中:

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

    onInit: function() {
      this.getView().addEventDelegate({
        onBeforeShow: function(event) {
          /*Do something with:*/this.getView().data("data");
        }
      }, this);
    },
    
    Run Code Online (Sandbox Code Playgroud)

另请参阅相关文档主题:导航时传递数据