像 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>