从服务返回的JSON的Knockout选项绑定

时间:2012-10-24 13:52:18

标签: json knockout.js knockout-mapping-plugin

道歉,如果已经提到或回答过但我已经找了几天而且无法解决这个问题。我是Knockout和StackOverflow的新手,请耐心等待。

我正在使用CakePHP并从我的控制器返回一些JSON,其格式如下

{"countries":[{"Country":{"id":"1","country":"England"}},{"Country":{"id":"2","country":"Wales\/Cymru"}},{"Country":{"id":"3","country":"Scotland"}},{"Country":{"id":"4","country":"Republic of Ireland"}},{"Country":{"id":"5","country":"Northern Ireland"}}]};

我希望将上述县作为select语句中的项目显示,其值设置为1,文本显示为国家/地区。但是我似乎无法为我做这个淘汰赛。我相信对于那些熟悉淘汰赛的人来说这是一个简单的问题,但是我无法理解该怎么做我看到的只是对象列表但不知道如何访问data-bind上的对象属性

HTML

<select data-bind="options:countries, optionsText:'Country'"></select>​

的Javascript

    var viewModel = {};

    var data = {"countries":[{"Country":{"id":"1","country":"England"}},{"Country":{"id":"2","country":"Wales\/Cymru"}},{"Country":{"id":"3","country":"Scotland"}},{"Country":{"id":"4","country":"Republic of Ireland"}},{"Country":{"id":"5","country":"Northern Ireland"}}]};

    var jsData = ko.mapping.fromJS(data);
    ko.applyBindings(jsData);

我已经创建了一个简单的JSFiddle http://jsfiddle.net/jbrr5/14/来展示正在发生的事情,通过这个小挑战可以获得任何帮助

2 个答案:

答案 0 :(得分:2)

您的数据结构奇怪。就像这样:

- countries
  - Country
    - id
    - country

实际idcountrycountries数组深处的另一个级别。你必须做一些黑客攻击才能让那些按原样出现在select元素中。如果你只是映射到内部Country对象会更好。

var mappingOptions = {
    'countries': {
        'create': function (options) {
            // map to the inner `Country`
            return ko.mapping.fromJS(options.data.Country);
        }
    }
};

var viewModel = ko.mapping.fromJS(data, mappingOptions);
ko.applyBindings(viewModel);

Updated fiddle

答案 1 :(得分:1)

你有非常复杂的数组结构。对于您的情况,您必须在'Country.country'绑定中编写options但它不起作用,因为绑定无法解析这种复杂的表达式。您可以使用options

,而不是使用optionsTextforeach绑定

    

这是工作小提琴:http://jsfiddle.net/vyshniakov/jbrr5/18/

但我建议您将数据结构更改为

{"countries":[{"id":"1","country":"England"}]};

或相应地映射数据。在这种情况下,您可以使用options绑定:

<select data-bind="options:countries, optionsText:'country', optionsValue:'id'"></select>​