数据绑定(Data Binding)
脚本编写(Scripting)允许您读取、修改并订阅视图模型(View Model)属性的更改,以及在运行时创建新的视图模型(View Model)实例。
提示(Tip) 有关视图模型(View Models)及其如何驱动图形的概念性概述,请参见 视图模型与数据绑定(View Models & Data Binding)。
视图模型(View Models)
脚本(Script)可以通过三种方式访问视图模型(View Models)及其属性:
- 通过上下文(Context)访问视图模型(View Models)
- 将视图模型(View Models)作为输入绑定(参见#view-models-as-inputs)
- 将视图模型(View Models)属性绑定到输入(参见#binding-inputs)
上下文(Context)
init 生命周期函数包含一个上下文(Context)参数,该参数可让您访问视图模型(View Models)。这使您可以读取值(字符串、枚举、列表等)、设置值、触发触发器、监听触发器,并订阅值的更改。
说明(Note) 除了视图模型(View Models)之外,上下文(Context) 还可让您访问命名资产和更新调度。
type MyNode = {}
function init(self: MyNode, context: Context): boolean
-- Get the view model from the node's immediate context.
local vmi = context:viewModel()
-- Get the root view model
local rootVmi = context:rootViewModel()
-- Get the view model from the parent node.
local parentDC = dc:parent()
local parentVmi = dc:viewModel()
end
return function(): Node<MyNode>
return {
init = init,
}
end
作为输入的视图模型(View Models as Inputs)
您可以创建一个脚本输入(Script Input),并将其绑定到视图模型(View Model)。这允许您读取值(字符串、枚举、列表等)、设置值、触发触发器、监听触发器,并订阅值的更改。
type MyNode = {
-- This input expects a view model instance of type Character
character: Input<Data.Character>
}
function init(self: MyNode, context: Context): boolean
local vmi = self.character
end
return function(): Node<MyNode>
return {
init = init,
-- Initialize with `late()` so the value
-- can be provided by the editor at runtime.
character = late(),
}
end
有关详细说明,请参见 视图模型输入(View Models Inputs)。
绑定输入(Binding Inputs)
如果只需要读取而不需要设置视图模型(View Model)属性,可以将视图模型(View Model)属性值绑定到脚本输入。 有关更多信息,请参见 数据绑定输入(Data Binding Inputs)。
嵌套视图模型(Nested View Models)
要引用嵌套的视图模型(View Model),请使用 getViewModel。
local vmi = context:viewModel(),
local dateVmi = vmi:getViewModel('dateViewModel')
读取与设置属性(Reading and Setting Properties)
以下方法允许您引用视图模型(View Model)属性:
local vmi = context:viewModel()
if vmi then
-- Get a reference to the score property from the view model
local score = vmi:getNumber('score')
if score then
-- Read the score
print(score.value)
-- Set the score
score.value = 100
end
-- Get a reference to the myTrigger property from the view model
local myTrigger = vmi:getTrigger('myTrigger')
if myTrigger then
-- Fire the trigger
mytrigger:fire()
end
end
监听属性更改(Listening for Property Changes)
添加监听器(Add a Listener)
使用 addListener 监听触发器或视图模型(View Model)属性的更改。
type MyNode = {}
function handleHoursChanged()
print('hours changed!')
end
function handleTriggerFired()
print('Fire!')
end
function init(self: MyNode, context: Context): boolean
local vmi = context:viewModel()
local hours = vm:getNumber('hours')
if hours then
-- handleHoursChanged is called whenever the hours value changes
hours:addListener(handleHoursChanged)
end
local trigger = vm:getTrigger('triggerProperty')
if trigger then
-- handleTriggerFired is called whenever the trigger is fired
trigger:addListener(handleTriggerFired)
end
return true
end
return function(): Node<MyNode>
return {
init = init,
}
end
移除监听器(Remove a Listener)
不再需要监听器时,请始终移除它们以避免内存泄漏。
type MyNode = {}
function init(self: MyNode, context: Context): boolean
local vmi = context:viewModel()
if not vmi then
print('No view model found')
return false
end
local hours = vmi:getNumber('hours')
if hours then
local function handleHoursChanged()
print('hours changed!')
-- Remove the event listener
hours:removeListener(handleHoursChanged)
end
-- handleHoursChanged is called whenever the hours value changes
hours:addListener(handleHoursChanged)
end
return true
end
return function(): Node<MyNode>
return {
init = init,
hours = late(),
trigger = late(),
}
end
创建视图模型(View Model)实例
敬请期待