1
    var viewModel = {
        foos: ko.observableArray([]),

        reloadFoos: function () {
            getFoos();
        }
    };

    var foo = function () {
        this.Id = ko.observable();
        this.Name = ko.observable();
    };

    function getFoos() {
        $.get("/myroute/", "", function (data) {
            for (var i = 0; i < data.length; i++) {
                var f = new foo();
                f.Id = data[i].Id;
                f.Name = data[i].Name;
                viewModel.foos.push(f);
            }

            ko.applyBindings(viewModel);
        });        
    }


<div data-bind="foreach: viewModel.foos">
    <button data-bind="click : $parent.reloadFoos, attr: { id: Id }"></button>
    <label data-bind="value: Name"></label>
</div>

ロード時にすべてが正常にロードされますが、ボタンをクリックすると、div ラベルが空白になり、何もバインドされませんが、エラーは発生せず、すべてのコードを実行しているようです。

4

3 に答える 3

1

この作業を行ういくつかの変更を加えたフィドルを作成しました: http://jsfiddle.net/johnpapa/dft3Z/

確かに、あなたがやろうとしていることを正確に理解することはできません。しかし、フィドルは配列を読み取り (ti をローカルに保つためだけに ajax 呼び出しの代わりに配列を使用しました)、一連のボタンを作成します。次に、それぞれのクリック イベントをバインドし、まったく新しい一連のボタンを追加します。あなたが持っていたコードにはいくつかの問題がありました。applyBindings は 1 回だけ発生する必要があり、viewModel は既にバインドされているため、HTML で指定する必要はなく、ラベルはテキスト バインディングを使用する必要があったと思います。

いずれにせよ、これは現在実行されています。

私はまだこれがあなたが望むものではないと思っています。何を達成しようとしているのかを説明していただければ、さらにお役に立てるかもしれません。

于 2012-07-13T01:47:13.353 に答える
0

reloadFoosはfoos配列のfooItemの親ではないと思います。あなたはこのようなことをすることができますか

for (var i = 0; i < data.length; i++) {
            var f = new foo();
            f.Id = data[i].Id;
            f.Name = data[i].Name;
            f.reloadFoos = function() { getFoos(); }
            viewModel.foos.push(f);
        }

次に、クリックしてreloadFoosを呼び出します

于 2012-07-12T21:57:21.337 に答える
0

viewModel. html では、これを次のように変更する必要はありません。

<div data-bind="foreach: foos">
<button data-bind="click : $parent.reloadFoos, attr: { id: Id }"></button>
<label data-bind="value: Name"></label>
</div>

アップデート:

わかりました、次のようにしてみてください:

var foo = function (id, name) {
    this.Id = ko.observable(id);
    this.Name = ko.observable(name);
};


function getFoos() {
    $.get("/myroute/", "", function (data) {
        for (var i = 0; i < data.length; i++) {
            var f = new foo(data[i].Id, data[i].Name);
            viewModel.foos.push(f);
        }            
    });        
}

ko.applyBindings(viewModel);

html:

<div data-bind="foreach: viewModel.foos">
<button data-bind="click: $parent.reloadFoos, attr: { id: Id }"></button>
<label data-bind="value: Name"></label>

ko.applyBindings(viewModel);関数定義の外側が必要であることに注意getFoosしてください-現在、呼び出されるたびに再バインドしているため、おそらく消えています

于 2012-07-12T21:49:29.993 に答える