我的主班是这样设置的:
class MyView : View() {
val controller: PollController by inject()
etc
}
我想传递一个变量(例如路径文件的字符串)
class PollController : Controller() {
val currentData = SimpleStringProperty()
val stopped = SimpleBooleanProperty(true)
val scheduledService = object : ScheduledService<DataResult>() {
init {
period = Duration.seconds(1.0)
}
override fun createTask() : Task<DataResult> = FetchDataTask()
}
fun start() {
scheduledService.restart()
stopped.value = false
}
inner class FetchDataTask : Task<DataResult>() {
override fun call() : DataResult {
return DataResult(SimpleStringProperty(File(**path**).readText()))
}
override fun succeeded() {
this@PollController.currentData.value = value.data.value // Here is the value of the test file
}
}
}
[DataResult仅仅是SimpleStringProperty数据类]
,以便类PollController中的函数可以引用路径文件。我不知道注射的工作原理。 @Inject始终保持红色,添加构造函数会抛出Controller()对象返回
答案 0 :(得分:1)
这是Scope的好用例。作用域将Controllers和ViewModels隔离开,以便您可以使用不同版本的资源使用不同的作用域。如果还添加一个ViewModel来保存上下文,则可以执行以下操作:
let assetWriter = try? AVAssetWriter(outputURL: outputURL, fileType: .mov)
FileManager.default.removeItemIfExist(at: outputURL)
// do something
现在将上下文对象添加到Controller中,以便您可以从控制器实例中的任何函数访问它。
class MyView : View() {
val pc1: PollController by inject(Scope(PollContext("somePath")))
val pc2: PollController by inject(Scope(PollContext("someOtherPath")))
}
上下文对象可以包含两个输入/输出变量。在此示例中,它以输入路径作为参数。请注意,框架无法实例化这种ViewModel,因此您必须像上面显示的那样手动将其中一个放入Scope。
class PollController : Controller() {
val context : PollContext by inject()
}
答案 1 :(得分:1)
您可以执行以下操作:
主应用
class MyApp: App(MainView::class)
MainView
class MainView : View() {
override val root = hbox {
add(FileView("C:\\passedTestFile.txt"))
}
}
FileView
class FileView(filePath: String = "C:\\test.txt") : View() {
private val controller : FileController by inject(params = mapOf("pathFile" to filePath))
override val root = hbox {
label(controller.pathFile)
}
}
FileController
class FileController: Controller() {
val pathFile : String by param()
}
控制器使用by param()
通过参数来访问路径,视图期望通过构造函数参数来使用此变量,并在注入控制器时使用它(inject
委托具有可选的params
论点)。使用此视图(在MainView
中时,唯一剩下的就是在实例创建时传递文件路径。
最后得到:
无论如何,我将创建3层而不是2层,即经典的model-view-controller(或任何派生)层,并将文件路径存储在模型中。