1

私はこれが私のBatmanJSコントローラーで機能すると仮定しました:

project = Project.find parseInt(params.id, 10), (err) ->
  throw err if err

@set 'project', project
**@set 'owner_id', project.get("owner_id")**

ただし、project.get( "owner_id")は常に未定義です。Project.findでの呼び出しが間違っているのではないかと思います。これは、railsに非常に似ていると思ったからです。私は何が間違っているのですか?

owner_idはプロジェクトの属性であり、ビューで有効です。

%p{"data-bind" => "owner_id"}

動作し、正しい所有者IDを吐き出します。

4

1 に答える 1

1

JSの多くのものと同様に、ドキュメントBatman.Model.findからの非同期メソッドです...

Model.find()callbackモデルに、指定されたレコードで指定されたを呼び出すように要求しますid

だから、これがあなたのコードで起こっていることの順序です...

  1. DBからデータを取得した後に関数を呼び出すようProject.findに指示Batman.Modelする呼び出し。callback
  2. その関数の戻り値を割り当てます(これは、後で入力される一種の約束です)。
  3. 'project'キーパスをその約束に設定します。
  4. すぐにその約束を呼びかけようとします#get(価値がある前に)。
  5. しばらくする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>
于 2012-08-31T20:30:46.670 に答える