Code: Select all
// in StepOneViewModel
masterWizardViewModel.nextStep(); // directly advances the wizard
< /code>
, das eine direkte Abhängigkeit zwischen untergeordneten und Master -VMs erstellt. Javafx Eigenschaftbindung [/b]
Lassen Sie jeweils StepViewModel einen einfachen BooleanProperty DoneProperty () freilegen und lassen// StepOneViewModel.java
@Component
public class StepOneViewModel {
private final BooleanProperty done = new SimpleBooleanProperty(false);
public BooleanProperty doneProperty() { return done; }
public void completeStep() {
// your background Task succeeded…
done.set(true);
}
}
// WizardViewModel.java
@Component
public class WizardViewModel {
@Autowired
StepOneViewModel stepOneVm;
public void initialize() {
stepOneVm.doneProperty().addListener((obs, was, done) -> {
if (done) advanceTo(Step.TWO);
});
}
private void advanceTo(Step next) { /* … */ }
}
Keine zusätzliche Feder-Boilerplate. /> cons < /strong> < /p>
WizardViewModel muss jedes StiefviewModel kennen und injizieren. /> 2. Spring ApplicationEvents
Veröffentlichen Sie ein Ereignis aus dem untergeordneten VM und lassen Sie WizardViewModel abonnieren:
Code: Select all
// StepCompletedEvent.java
public class StepCompletedEvent extends ApplicationEvent {
private final Step step;
public StepCompletedEvent(Object src, Step step) { super(src); this.step = step; }
public Step getStep() { return step; }
}
// StepOneViewModel.java
@Autowired ApplicationEventPublisher events;
public void completeStep() {
events.publishEvent(new StepCompletedEvent(this, Step.ONE));
}
// WizardViewModel.java
@Component
public class WizardViewModel {
@EventListener
public void onStepCompleted(StepCompletedEvent e) {
advanceTo(e.getStep().next());
}
private void advanceTo(Step next) { /* … */ }
}
Lose Kopplung - Publisher muss keine Abonnenten kennen. /> cons < /strong> < /p>
Mehr Boilerplate (Ereignisklasse + Hörer). /> Fragen < /strong> < /p>
Habe ich signifikante Kompromisse zwischen diesen beiden Mustern verpasst? oder gotchas sind Sie begegnet?>