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/

诚然,我无法确切地弄清楚您要做什么。但是小提琴读取数组(我使用数组而不是ajax调用只是为了保持本地化),并创建一系列按钮。然后它为每个绑定单击事件,然后添加一组全新的按钮。您的代码存在一些问题。applyBindings 应该只发生一次,viewModel 已经绑定,因此 HTML 不需要指定它,并且标签应该使用文本绑定,我怀疑。

无论如何,这确实现在运行。

我仍然怀疑这不是你想要的。也许如果您解释您要完成的工作,我们可以提供进一步的帮助。

于 2012-07-13T01:47:13.353 回答
0

在 html 中,您不需要将其viewModel. 更改为:

<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 回答
0

我不认为 reloadFoos 是 foos 数组中 foo Item 的父项。你能做这样的事情吗

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 回答