假设显示复杂数据结构的页面(例如,包含许多详细信息的文章)。该视图将不时通过将其重新绑定到不同的文章来重复使用。
现在,我注意到ODataModel将所有已使用的文章实体保留在内存中(如果它们不再绑定到任何控件,也是如此)。
这将导致两个问题:
第二个问题似乎是更大的问题。它会降低应用程序的速度。
我还没有找到解决该问题的方案。如果我使用refresh(true, true)
,似乎所有数据都会重新加载。
有没有办法清理模型?
假设您有数千篇文章的列表。用户可以单击其中一篇文章,然后导航到该文章的详细屏幕。 客户端的OData模型将缓存此问题。要查看它,请执行以下操作:
var oModel = this.getModel("modelName");
查看调试器到oModel.oData
。
如果用户现在导航回来并选择下一篇文章,那么它也会被缓存。
如果用户执行此操作1000次,则所有文章现在都在模型中。
如果触发oModel.refresh(true);
,所有这些数据(1000篇文章)将不仅会重新加载到视图中的数据。
现在我的申请不是要显示文章信息。这是一个更复杂的子项目结构。每次用户访问此页面时,都会缓存更多数据(如果对模型进行refresh
调用,则会重新获取数据)。
函数updateBindings(bForceUpdate?)
似乎有点帮助。
无论如何,ODataModel类中仍然存在数据累积。
这意味着:自从整页的下一次重新加载(F5)以来,每个访问过的数据路径将保留在内存中。如果有人在一天内使用此类应用,则数据累积,并且模型上的刷新调用将再次读取所有数据,如果仍然< strong>绑定到视图或不是。
答案 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
数组并删除多余的绑定。