例如,我的 gwt-app 由两个 View 组成,并通过 appController().goTo(place) 从 view1 导航到 view2。 ClientFactory 保存 View 对象。
ClientFactoryImpl implements ClientFactory{
public View1 getView1(){
if(view1 == null){
view1 = new ViewImpl1();
}
return view1;
}
public View2 getView2(){
if(view2 == null){
view2 = new ViewImpl2();
}
return view2;
}
}
view1 的所有 dom 元素都从浏览器中消失,并加载 view2 的新 dom 元素。 如果 iam 现在在 view2 上并且按下后退按钮,它将返回到 view1 并且 view1 具有与之前相同的状态。 我的问题是导航到 view2 后 view1 会发生什么。 view1 的所有这些 DOM 元素(如按钮、列表等)会发生什么。他们在哪里? 它说创建 DOM 元素的成本很高,但是当 iam 导航回 view1 时,view1 的 DOM 元素必须再次渲染到 DOM 浏览器中,还是我理解错误? 导航后,所有这些小部件(在最后的 DOM 元素处)在后台发生了什么,以及它们在导航回来后如何返回到 dom。 如果每次 ClientFactory 都会返回一个新的 View 对象实例,那么区别在哪里? 请帮忙!
抱歉我的英语不好,希望我的问题很清楚。
最佳答案
由于您将 ViewImpl1
和 ViewImpl2
实例保留为 ClientFactory
中的延迟初始化单例,因此每个小部件的 DOM 元素将保留在内存。
向/从另一个小部件添加/删除小部件,然后将其 DOM 元素附加到父小部件的 DOM 元素/从父小部件的 DOM 元素分离,最终附加到文档。
如果您将 ClientFactory
更改为始终返回新实例,则您始终必须创建 DOM 元素,而不是重新使用它们。根据 View 的复杂性,这可能会对应用程序的性能产生负面影响(尽管将大 View 保留在内存中也会因消耗过多内存而减慢应用程序的速度,特别是在资源受限的设备,例如手机/平板电脑;这是一种权衡,您必须找到正确的平衡点:将接下来最有可能使用的屏幕保留在缓存中/内存中)。
以上所有内容均假设架构类似于 http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html
关于javascript - View 转换后,浏览器中的旧 View 或 DOM 元素会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459768/