2011-09-13 11 views
0

私はこのようなビューモデルがあります:私は、ディープ観測とのforeachテンプレート

m.a(new thing()); 

:私は(mは私viewModelです)これを実行しようとするいくつかの時点で

function viewModel() { 
    this.a = ko.observable(); 
} 

をこのようなテンプレートバインディング:

<ul data-bind="template: { name: 't', foreach: a().b }"></ul> 

しかし、何かが起こる前にクラッシュするa()は、最初はundefinedまたはnullです。だから私はこの変化を試みた:

<ul data-bind="template: { name: 't', foreach: a.b }"></ul> 

をしかし、これは、今、それがクラッシュしていないので、奇妙であるが、単一の空のアイテムをレンダリング、テンプレートtを使用して、それが間違っているのです。

私はここで少し犠牲になっていますが、私はソースを定義することができたと思っていましたが、変更されたものはちょうど更新するものですが、私は間違っているの?

答えて

3

あなたは、このように結合あなたを書くことで未定義のプロパティを打つから身を守ることができます。そうしないと、あなたはあなたのビューモデルにこの懸念を押すなどdependentObservableを作成することができます

<ul data-bind="template: { name: 't', foreach: a() ? a().b : [] }"></ul> 

viewModel.c = ko.dependentObservable(function() { 
    return this.a() ? this.a().b : []; 
}, viewModel); 
+0

投稿直後、私はそれが 'dependentObservable'で動作することを発見したので、私はそのatmを使用しています。私は式を使用することを考えましたが、バインディングでどのように動作するのか見当たらないので、私はそれを排除しました。これが要件であるかどうか知っていますか?もしあなたが深い観察可能なものを持っていれば、右側は依存しなければならないのですか?ああ、これはあまり意味がありません。私はこのようなビューモデルで短絡してはいけません... –

+0

理想的には、テンプレートに "a"機能をラップします。次に、そのテンプレート「

」を呼び出します。 'a'がnullの場合、レンダリングされません。テンプレートの中で、 'b'を自由に使うことができます。 –

+1

KO 1.3では、コントロールフローバインディングを使用して、これをさらに簡単にすることができます: '

  • ...
' –

関連する問題