JSの多くのものと同様に、ドキュメントBatman.Model.find
からの非同期メソッドです...
Model.find()
callback
モデルに、指定されたレコードで指定されたを呼び出すように要求しますid
。
だから、これがあなたのコードで起こっていることの順序です...
- DBからデータを取得した後に関数を呼び出すよう
Project.find
に指示Batman.Model
する呼び出し。callback
- その関数の戻り値を割り当てます(これは、後で入力される一種の約束です)。
'project'
キーパスをその約束に設定します。
- すぐにその約束を呼びかけようとします
#get
(価値がある前に)。
- しばらくする
find
と、DBから返されるproject
ため、'project'
キーパスはプロジェクトの値で更新されますが、'owner_id'
まだ定義されていません。
これを修正するには、中間キーパスを設定するのではなく、ビュー内のモデルの属性に直接バインドします。
つまり。これをコントローラーに入れてください...
@set 'project', Project.find parseInt(params.id, 10), (err) -> throw err if err
...そしてこれはあなたの見解では...
<p data-bind="project.owner_id"></p>
プロジェクトが最終的にDBから到着すると、その要素は次のように更新されます。owner_id
または、コントローラーでその値を使用して何かをowner_id
実行する場合は、キーパスのオブザーバーを設定しますproject
。これは、DBから到着したときにトリガーされます。
@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
リターンが返されると、キーパスが設定され、'project'
次にキーパスが設定されます。'project.owner_id'
これにより、オブザーバーがに移動してキーパスを取得しOwner
て設定します。'owner'
だから今あなたはあなたの見解に持つことができます...
<h3 data-bind="owner.name"></h3>