こんにちは、私は昨日、ノックアウトを使用する場合の dom 操作/アニメーションなどをコーディングする場所について質問しました。以前にこれをビューモデルにコーディングしましたが、これは正しくないとアドバイスされました。
アドバイスに従ってコードを更新し、カスタム バインディング ハンドラーを作成しましたが、カスタム バインディング ハンドラー内からビューモデルのメソッドを呼び出す必要があります。具体的には、アニメーションが完了するとき。私はこのようにそれをやった
ko.bindingHandlers.slideUp = {
init:function(element, valueAccessor, allBindingsAccessor, context){
var allBindings = allBindingsAccessor();
var parent = allBindings.parent;
$(element).click(function(){
if(parent.SelectedEmployee() === valueAccessor())return;
var $PanelWrapper = $('#' + allBindings.panelName);
var $Bottom = parseInt($PanelWrapper.css("bottom"));
if($Bottom === 0){
$PanelWrapper.animate({
bottom:"-95"
}, 500, function(){
parent.Select(valueAccessor());
}).animate({
bottom:"0"
}, 500);
}else{
parent.Select(valueAccessor());
$PanelWrapper.animate({
bottom:"0px"
}, 500);
}
});
}
}
そして私のバインディングは
<tbody data-bind="foreach: Emps">
<tr data-bind="slideUp: $data, parent: $parent, panelName: 'PanelWrapper'">
<td data-bind="text: Name"></td>
</tr>
</tbody>
ご覧のとおり、ビューモデルへの参照と、アニメーション化するタグの ID を渡しています。これがこれを行う正しい方法であるかどうか疑問に思っています。ビューモデルを参照するより良い方法はありますか?ビューモデルのメソッドを正しく呼び出していますか?使用したい html タグの ID を渡しても問題ありませんか? それはすべて正常に機能しますが、改善したいと思っています
ここに私のフィドルへのリンクがあります