2

こんにちは、私は昨日、ノックアウトを使用する場合の 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 を渡しても問題ありませんか? それはすべて正常に機能しますが、改善したいと思っています

ここに私のフィドルへのリンクがあります

4

1 に答える 1