2012-04-12 11 views
55

最近ViewModelを別のJavaScriptファイルに分けました。ここでノックアウト発射クリックバインドapplyBindings

var Report = (function($) { 
    var initialData = []; 
    var viewModel = { 
     reports: ko.observableArray(initialData), 
     preview: function(path) { 
      // preview report 
     }, 
     otherFunctions: function() {} 
    }; 
    return viewModel; 
})(jQuery);​ 

HTMLおよびノックアウト関連するコード

<script type="text/javascript" src="path/to/report/javascript"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     ko.applyBindings(Report, document.body); 
    }); 
</script> 

HTMLユーザー・インタフェースは、クリックはビューモデルのプレビュー機能に

<input type="button" name="Preview" id="Preview" class="btnPreview" 
    data-bind="click: Report.preview('url/to/report')" /> 

問題のデータバインドされているボタンを持っていますプレビューメソッドは、$(document).ready()関数内で次の行が実行されたときに呼び出されます

ko.applyBindings(Report, document.body); 

ユーザーがプレビューボタンをクリックしないと、プレビュー機能が起動します。この行動の理由は何でしょうか? HTMLページ自体でモデルJavaScriptを見ると、全体的にうまくいきました。

答えて

78

なぜなら、実際にはプレビュー機能を呼び出すからです(functionNameを書くということは、関数を参照することを意味するため、functionName()と書くということです)。

だから、data-bind="click: Report.preview"は期待通りに動作しますが、パラメータを引き渡すことはありません。 the manual状態(別のトピックで、これはまだ適用される)として

あなたはより多くのパラメータを渡す必要がある場合は、それを行うための一つの方法は、中に取る関数リテラルであなたのハンドラをラップすることですこの例のように、パラメータ、:

<button data-bind="click: function(data, event) { myFunction(data, event, 'param1', 'param2') }"> 
    Click me 
</button> 

またはあなたの場合:

data-bind="click: function() { Report.preview('url/to/report') }" 

別の解決策は、プレビュー()(実際にはほとんど同じこと)関数を返す作るために次のようになります。

preview: function(path) { 
    return function() { 
     // ... 
    } 
} 
+7

この回答を得るまでに数分かかりました。私が必要としたのは、関数ポインタを返す代わりに呼び出しを実行する '()'を使って 'Report.preview'を呼び出しているからです。角かっこなしでは期待どおりに動作します。 – Peter

21

別の解決策を構築する「バインド」を使用することです:

data-bind="click: Report.preview.bind($data, 'url/to/report')" 

ところ最初のbind()へのパラメータは、呼び出された関数の 'this'になります。

関連する問題