2

例如,我的 gwt-app 包含两个视图,并通过 appController().goTo(place) 从 view1 导航到 view2。ClientFactory 持有视图对象。

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 元素。如果我现在在 view2 上并且我按下后退按钮,它将返回到 view1 并且 view1 具有与以前相同的状态。我的问题是导航到 view2 后 view1 会发生什么。view1 的所有这些 DOM 元素(如按钮、列表等)会发生什么情况。他们在哪里?它说创建 DOM 元素很昂贵,但是当我导航回 view1 时,必须再次将 view1 的 DOM 元素呈现到 DOM 浏览器中,或者我理解错了?导航后所有这些小部件(位于最后的 DOM 元素)在后台会发生什么,以及它们如何在导航返回后返回到 dom。如果每次 ClientFactory 都会返回 View Object 的新实例,那么区别在哪里?请帮忙!

对不起我的英语不好,希望我的问题很清楚。

4

2 回答 2

1

它们被缓存在内存中,并在需要时复制到 DOM 中。当您离开时,它们只会被删除,但缓存仍然存在。前几天我刚刚在 YouTube 上看过这个。我认为它是 IO 10 左右......让我去找你的链接......

我认为这是一个:http ://m.youtube.com/watch?v=0F5zc1UAt2Y如果我没记错的话,他们在问答期间谈到了视图缓存

于 2013-07-03T23:39:12.290 回答
1

因为您将ViewImpl1ViewImpl2实例作为延迟初始化的单例保存在 中ClientFactory,所以每个小部件的 DOM 元素都将保存在内存中。

向/从另一个小部件添加/删除小部件,然后将其 DOM 元素附加到/从父小部件的 DOM 元素中附加/分离,并最终附加到文档。

如果您将您的更改ClientFactory为始终返回一个新实例,您将始终必须创建 DOM 元素,而不是重复使用它们。根据视图的复杂性,这可能会对您的应用程序的性能产生负面影响(尽管将大视图保存在内存中也可能会因消耗过多的内存而减慢应用程序的速度,尤其是在手机/平板电脑等资源受限的设备上;这是一种交易-关闭,您必须找到正确的平衡点:将最有可能使用的屏幕缓存/在内存中)。

以上所有假设的架构类似于http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html

于 2013-07-04T00:09:10.647 回答