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

时间:2015-10-21 10:46:43

标签: sapui5

假设显示复杂数据结构的页面(例如,包含许多详细信息的文章)。该视图将不时通过将其重新绑定到不同的文章来重复使用。

现在,我注意到ODataModel将所有已使用的文章实体保留在内存中(如果它们不再绑定到任何控件,也是如此)。

这将导致两个问题:

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

    我还没有找到解决该问题的方案。如果我使用refresh(true, true),似乎所有数据都会重新加载。

    有没有办法清理模型?

    修改

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

    var oModel = this.getModel("modelName");
    

    查看调试器到oModel.oData

    如果用户现在导航回来并选择下一篇文章,那么它也会被缓存。

    如果用户执行此操作1000次,则所有文章现在都在模型中。 如果触发oModel.refresh(true);,所有这些数据(1000篇文章)将不仅会重新加载到视图中的数据。

    现在我的申请不是要显示文章信息。这是一个更复杂的子项目结构。每次用户访问此页面时,都会缓存更多数据(如果对模型进行refresh调用,则会重新获取数据)。

    编辑2

    函数updateBindings(bForceUpdate?)似乎有点帮助。 无论如何,ODataModel类中仍然存在数据累积。 这意味着:自从整页的下一次重新加载(F5)以来,每个访问过的数据路径将保留在内存中。如果有人在一天内使用此类应用,则数据累积,并且模型上的刷新调用将再次读取所有数据,如果仍然< strong>绑定到视图或不是

3 个答案:

答案 0 :(得分:2)

试试deleteCreatedEntry(oContext)。尽管这不是此方法的假设用例,但它可能会从模型中删除实体而不会触发后端请求。

如果updateBindings(bForceUpdate?)仅触发实际绑定实体的更新,您也可以尝试。

答案 1 :(得分:1)

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

2)也许您应该查看Odata过滤(http://www.odata.org/getting-started/basic-tutorial/),以便您只加载您真正想要的实体。如果您只想加载实体的一部分,那么您应该重新设计实体以避免大量开销。

很难推测出你的确切问题。

答案 2 :(得分:-1)

好吧,如果你确切地知道你在做什么,你可以尝试这样的事情:

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

更好的解决方案是通过aBindings数组并删除多余的绑定。