为什么在调用EventHandler(GWT)之前调用了GateKeeper的canReveal()?
我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中) 所以我想使用MyGateKeeper来管理登录页面。将触发PassUserInfoEvent的HeaderPresenter为什么在调用EventHandler(GWT)之前调用了GateKeeper的canReveal()?,gwt,gwtp,Gwt,Gwtp,我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中) 所以我想使用MyGateKeeper来管理登录页面。将触发PassUserInfoEvent的HeaderPresenter public class MyGateKeeper implements Gatekeeper{ private String logined
public class MyGateKeeper implements Gatekeeper{
private String loginedUserID="";
private final EventBus eventBus;
@Inject
public MyGateKeeper (final EventBus eventBus){
this.eventBus = eventBus;
this.eventBus.addHandler(PassUserInfoEvent.getType(), new PassUserInfoHandler(){
@Override
public void onPassUserInfo(PassUserInfoEvent event) {
// TODO Auto-generated method stub
String userID=event.getUserID();
loginedUserID=userID;
}
});
}
@Override
public boolean canReveal(){
System.out.println(loginedUserID+"Test");
if(!loginedUserID.equals("")){
System.out.println(loginedUserMeaningID+"cxcxc");
return true;
}
else{
return false;
}
}
}
在CustomerPresenter中:
@ProxyCodeSplit
@NameToken(NameTokens.cust)
@UseGatekeeper(MyGateKeeper.class)
public interface MyProxy extends ProxyPlace<CustomerPresenter> {
}
@ProxyCodeSplit
@NameToken(NameTokens.cust)
@UseGatekeeper(MyGateKeeper.class)
公共接口MyProxy扩展了ProxyPlace{
}
但是,在运行之后,即使我登录了,它也不会显示Gui。我测试并发现在调用PassUserInfoHandler()
之前调用了MyGateKeeper中的canReveal()
,因此canReveal
从不返回true
如何解决此问题?完成此操作的常用模式是在
单例中绑定CurrentUser
类:
bind(CurrentUser.class).in(Singleton.class);
并将其注入您的网守
。在您的GateKeeper
的方法中,您将检查currentUser.isLoggedIn()
:
您应该通过调用服务器来初始化引导程序中的CurrentUser.isLoggedIn
字段(请参阅)。下面是一个使用GWTP的RestDispatch
的示例:
public class BootstrapperImpl implements Bootstrapper {
private final String unauthorizedPlace;
private final CurrentUser currentUser;
private final PlaceManager placeManager;
private final RestDispatch restDispatch;
private final UserResource userResource;
@Inject
BootstrapperImpl(
@UnauthorizedPlace String unauthorizedPlace,
CurrentUser currentUser,
PlaceManager placeManager,
RestDispatch restDispatch,
UserResource userResource) {
this.unauthorizedPlace = unauthorizedPlace;
this.currentUser = currentUser;
this.placeManager = placeManager;
this.restDispatch = restDispatch;
this.userResource = userResource;
}
@Override
public void onBootstrap() {
checkIfUserIsLoggedIn();
}
private void checkIfUserIsLoggedIn() {
restDispatch.execute(userResource.isCurrentUserLoggedIn(), new AbstractAsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean isCurrentUserLoggedIn) {
navigate(isCurrentUserLoggedIn);
}
});
}
private void navigate(Boolean isCurrentUserLoggedIn) {
currentUser.setLoggedIn(isCurrentUserLoggedIn);
if (isCurrentUserLoggedIn) {
placeManager.revealCurrentPlace();
} else {
placeManager.revealPlace(new PlaceRequest.Builder().nameToken(unauthorizedPlace).build());
}
}
}
公共类BootstrapperImpl实现引导程序{
私人最终字符串未经授权的位置;
私有最终CurrentUser CurrentUser;
私人最终配售经理配售经理;
私人最终再调度再调度;
私有最终用户资源用户资源;
@注入
BootstrapperImpl(
@未经授权的放置字符串未经授权的放置,
当前用户当前用户,
PlaceManager PlaceManager,
重新调度重新调度,
用户资源(用户资源){
this.unauthorizedPlace=未经授权的场所;
this.currentUser=currentUser;
this.placeManager=placeManager;
this.restDispatch=restDispatch;
this.userResource=userResource;
}
@凌驾
bootstrap()上的公共无效{
checkIfUserIsLoggedIn();
}
私有void checkIfUserIsLoggedIn(){
restDispatch.execute(userResource.isCurrentUserLoggedIn(),新的AbstractAsyncCallback()){
@凌驾
成功时的公共void(布尔值isCurrentUserLoggedIn){
导航(isCurrentUserLoggedIn);
}
});
}
私有void导航(布尔值isCurrentUserLoggedIn){
currentUser.setLoggedIn(isCurrentUserLoggedIn);
if(isCurrentUserLoggedIn){
placeManager.revealCurrentPlace();
}否则{
placeManager.revealPlace(新PlaceRequest.Builder().nameToken(unauthorizedPlace.build());
}
}
}
public class BootstrapperImpl implements Bootstrapper {
private final String unauthorizedPlace;
private final CurrentUser currentUser;
private final PlaceManager placeManager;
private final RestDispatch restDispatch;
private final UserResource userResource;
@Inject
BootstrapperImpl(
@UnauthorizedPlace String unauthorizedPlace,
CurrentUser currentUser,
PlaceManager placeManager,
RestDispatch restDispatch,
UserResource userResource) {
this.unauthorizedPlace = unauthorizedPlace;
this.currentUser = currentUser;
this.placeManager = placeManager;
this.restDispatch = restDispatch;
this.userResource = userResource;
}
@Override
public void onBootstrap() {
checkIfUserIsLoggedIn();
}
private void checkIfUserIsLoggedIn() {
restDispatch.execute(userResource.isCurrentUserLoggedIn(), new AbstractAsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean isCurrentUserLoggedIn) {
navigate(isCurrentUserLoggedIn);
}
});
}
private void navigate(Boolean isCurrentUserLoggedIn) {
currentUser.setLoggedIn(isCurrentUserLoggedIn);
if (isCurrentUserLoggedIn) {
placeManager.revealCurrentPlace();
} else {
placeManager.revealPlace(new PlaceRequest.Builder().nameToken(unauthorizedPlace).build());
}
}
}