0

我正在使用 knockout.js 构建排序列表。我有一个使用简单的可观察数组的版本,但我怎样才能让它与我的 json 数据一起使用并使用映射插件?

http://jsfiddle.net/infatti/x66Ts/

        // Here is my json data
        var viewModel;
        $.getJSON('http://echo.jsontest.com/name/Stuart', function (data) {
            viewModel = ko.mapping.fromJS(data);
            ko.applyBindings(viewModel);
        });

// Here is my working version of the simple observable array. How can it work using json data and the mapping plugin?
var ListSortModel = function () {

  // my items
    this.allItems = ko.observableArray([
        { name: 'Denise' },
        { name: 'Charles' },
        { name: 'Bert' }
    ]); 

    // sorter
    this.sortItems = function() {
        this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;}));
    };
};

ko.applyBindings(new ListSortModel());
4

1 回答 1

0

您的<ul>元素绑定到allItems视图模型数组。但是当您映射结果时,您只有一个具有可观察属性的对象name。没有allItems财产。因此,您只会收到一个错误:

错误:无法解析绑定。消息:ReferenceError: allItems 未定义;绑定值:foreach:allItems

另一个问题是您得到单个项目{"name": "Stuart"}作为响应(而不是项目数组)。您不能只将该项目分配给视图模型的allItems属性。您需要将该项目添加到查看模型项目:

var viewModel = new ListSortModel();
ko.applyBindings(viewModel);

$.getJSON('http://echo.jsontest.com/name/Stuart', function (data) {
    var item = ko.mapping.fromJS(data); // make it observable
    viewModel.allItems.push(item); // add to view model items
});
于 2013-05-28T16:26:31.327 回答