Sapui5 如何删除不再使用的OData绑定?

Sapui5 如何删除不再使用的OData绑定?,sapui5,Sapui5,假设一个页面显示复杂的数据结构(例如,一篇包含许多细节的文章)。通过将此视图重新绑定到不同的文章中,可以不时重用此视图 现在,我注意到ODataModel将所有使用过的项目实体保存在内存中(如果它们不再绑定到任何控件) 这将导致两个问题: 内存消耗会随着时间的推移而增加(如果应用程序不会重新加载) 如果应用程序强制刷新数据模型,则将加载(也不使用)所有实体 第二个问题似乎是更大的问题。它会降低应用程序的速度 我还没有找到解决那个问题的办法。如果我使用refresh(true,true)似乎所有数

假设一个页面显示复杂的数据结构(例如,一篇包含许多细节的文章)。通过将此视图重新绑定到不同的文章中,可以不时重用此视图

现在,我注意到ODataModel将所有使用过的项目实体保存在内存中(如果它们不再绑定到任何控件)

这将导致两个问题:

  • 内存消耗会随着时间的推移而增加(如果应用程序不会重新加载)
  • 如果应用程序强制刷新数据模型,则将加载(也不使用)所有实体
  • 第二个问题似乎是更大的问题。它会降低应用程序的速度

    我还没有找到解决那个问题的办法。如果我使用
    refresh(true,true)
    似乎所有数据都将被重新加载

    有没有办法清洁模型

    编辑 假设您有一个包含数千篇文章的列表。用户可以单击其中一篇文章,并将导航到该文章的详细屏幕。 客户端中的OData模型将对此进行缓存。要查看它,请执行以下操作:

    var oModel = this.getModel("modelName");
    
    使用调试器查看
    oModel.oData

    如果用户现在返回并选择下一篇文章,这篇文章也将被缓存

    如果用户这样做1000次,所有文章现在都在模型中。 如果触发
    oModel.refresh(true),所有这些数据(1000篇文章)将被重新加载,而不仅仅是绑定到视图的数据

    现在,我的应用程序不是关于显示文章信息。它是一个包含子项的更复杂的结构。每次用户访问此页面时,都会缓存更多的数据(并在模型上进行
    刷新
    调用时重新获取)

    编辑2 函数
    updateBindings(bForceUpdate?
    似乎有点帮助。 无论如何,ODataModel类中仍然存在数据积累。 这意味着:自下一次重新加载(F5)整页以来,每个访问的数据路径都将保留在内存中。如果有人在一天内使用这样的应用程序,数据将累积,并且对模型的刷新调用将再次读取所有数据,如果仍然绑定到视图或不绑定到视图请尝试。尽管这不是该方法的假定用例,但它可以在不触发后端请求的情况下从模型中删除实体

    如果只触发实际绑定实体的更新,您也可以尝试。

    1)我不太理解您的问题。你到底在做什么?OData始终保存请求的结果以及对该请求的更改队列。如果在应用程序运行时创建大量条目,那么内存消耗当然会增加。如果要恢复到原始请求,可以使用。这样,使用的内存将再次减少。但您将丢失对模型的所有更改

    2) 也许您应该研究Odata筛选()以便只加载您真正想要的实体。如果您只希望加载实体的一部分,那么您应该重新设计实体,以避免大量开销


    很难推测你的确切问题是什么。

    好吧,如果你确切知道自己在做什么,你可以尝试以下方法:

    this.getModel("modelname").aBindings = []
    

    更好的解决方案是通过
    索引
    数组并删除冗余绑定。

    我必须刷新完整模型,因为有时一个实体的更新会更改多个数据(在服务器端)。因此,必须完全刷新模型,但不能再将元素绑定到任何控件(但它们仍然存在,并且需要花费时间)。这与创建无关。该示例仅说明在纯“显示”操作期间ODataModel中的数据积累。每次我将一个不同的实体绑定到一个现有视图时(新的当然会显示,但旧的驻留在ODataModel中)。现在的问题是,如果我更改了同一个模型的某个what-ever实体,并刷新了整个模型,那么所有其他数据也将被重新加载——如果它们没有绑定到任何数据的话。看起来三年后仍然不是一个好的解决方案。也许在SAPUI5 1.52.x中,OData的新无效方法会有所帮助。但目前我不得不使用1.48.x:-/