1

初期化関数に Knockout バインディングを適用し、jQuery デリゲートを使用して他のイベントをバインドします。

init = function (){

    ko.applyBindings(_data);

    $('#tabs').tabs();

    $('#container').delegate(".expand_all", "click", (function () {...})
}

ビュー モデルには、オブザーバブルと、ajax 呼び出し後にオブザーバブルを変更する関数があります。

function(data){

    var self = this;
    var name = ko.observable(data.name);

    self.changeName = function(){
        getName(function(data){
            ......
            self.name(data.name);
            ......
            ......
        }
    }
}

HTML マークアップ

<div id="container">
    <a href='#' data-bind='click: changeName'></a>
    <div id="tabs">
          <ul>
                 <li>......</li>
                 <li>......</li>
          </ul>
    </div>
    <a href='#' class="expand_all"></a>
</div>

奇妙なことに、changeName がトリガーされた後、#tabs と #div のイベント バインディングが失われました。

誰か光を当ててください。

4

2 に答える 2

2

knockout.js オブザーバブルは、プライベートではなく、パブリックにする必要があります。

self.name = ko.observable(data.name);

書かれているように、変数が誤ってプライベートに宣言されているため、コールバックでself.name()呼び出されたときに使用できる関数はありません。self.changeName()name

ブラウザのコンソールで例外が見つかる可能性が非常に高いです。

于 2012-10-08T08:30:59.140 に答える
1

カスタムバインディングはあなたの問題を解決しますか?

ko.bindingHandlers.myBindingName = {
    init: function(element, valueAccessor, 
                   allBindingsAccessor, viewModel, bindingContext) {

        var $elem = $(element);
        // Apply event handler on $elem

    },
    update: function(element, valueAccessor, 
                     allBindingsAccessor, viewModel, bindingContext) {

        // Handle value updated here

    }
};

マークアップで:

<a href='#' data-bind='myBindingName: changeName'></a>
于 2012-10-08T08:20:29.037 に答える