关于这个主题的教程和示例,但它们都是一种通用构建,只在一个类中展示它是如何工作的。
所以我的问题是我什么时候想遵循 MVVM 模式,我必须实现我的所有任务?
鉴于以下情况:
型:
class Model {
/* When I place the Task here how can I deal with arguments and results from ViewController? */
public BufferedImage bigTask (String this, String and, Image that){
// Some code to build a BufferedImage
}
}
视图模型:
class ViewController {
private BufferedImage myBufferedImage;
@FXML
private Button aButton;
/*Should I implement my Task here? But how I get information about progress? */
final Task<Integer> myTask = new Task<Integer>(){
@Override
protected Integer call() throws Exception{
updateProgress( // How to get here? Is it the right place? )
return null;
}
};
@FXML
void setOnAction(ActionEvent actionEvent){
myBufferedImage = Model.bigTask("this", "that", new Image("path"));
}
}
希望我能解释这个问题。
提前感谢!
您的任务应该在 ViewModel 中实现。业务逻辑的实际实现应在模型中完成,例如在服务类中。然后,ViewModel 可以使用此服务并处理所有特定于 UI 的操作,例如创建用于异步执行的任务和更新进度值。但是,ViewModel 可能不会直接更新进度指示器,而是 ViewModel 可以具有在 ViewModel 中更新的 DoubleProperty "进度"。在 ViewController/CodeBehind 中,将实际的进度指示器绑定到 ViewModel 的此进度属性。这样,视图模型独立于实际的 UI 控件,并且视图不包含任何业务逻辑。
我认为你的例子有点特别。通常我会说"BufferedImage"是一个特定于UI的类,它只属于视图,而不属于视图模型或模型。但是,您的示例看起来像 BufferedImage 是业务操作的结果。在这种情况下,我会在您的视图模型中创建一个ObjectProperty<BufferedImage>
,并将加载图像的任务也放在视图模型中。在您的视图控制器中,我会向此属性添加一个侦听器,并在图像更改时将图像放入 UI 中。这样,View 类就与图像的加载方式无关。