像 JS 中的许多东西一样,Batman.Model.find
是一种异步方法,来自docs ...
Model.find()
要求模型使用给定callback
的记录调用给定id
。
所以,这是代码中发生的事情的顺序......
- Call
Project.find
告诉我们在从数据库中检索数据后Batman.Model
调用我们的函数。callback
- 分配该函数的返回值(这是一种稍后将填写的承诺)。
- 设置该
'project'
承诺的关键路径。
- 立即尝试调用
#get
该承诺(在它具有价值之前)。
- 一段时间后,
find
来自数据库的返回project
等因此您的'project'
keypath 将使用您的项目的值进行更新 - 但'owner_id'
仍然未定义。
通过不尝试设置中间键路径来解决此问题,而只是直接绑定到视图中模型的属性。
IE。在你的控制器中有这个...
@set 'project', Project.find parseInt(params.id, 10), (err) -> throw err if err
...然后在您看来...
<p data-bind="project.owner_id"></p>
当项目最终从数据库到达时,该元素将更新为owner_id
或者,如果您想在控制器中使用该owner_id
值执行某些操作,则为 keypath 设置一个观察者,该观察者将在project
从数据库到达时触发,例如。
@observe 'project.owner_id', (id) =>
if id
@set 'owner', Owner.find id, (e) -> throw e if e
@set 'project', Project.find parseInt(params.id, 10), (err) -> throw err if err
因此,当Project.find
返回时,它将设置keypaths'project'
并依次设置'project.owner_id'
keypaths,这将触发您的观察者去检索Owner
并设置'owner'
keypaths。所以现在你可以在你的视野中......
<h3 data-bind="owner.name"></h3>