0

有没有办法更“自动”地做到这一点?

JavaScript 代码

var _json = {
  Parents : [
      { ID: 1, Option: { ID: 0, Name: "Zero" } },
      { ID: 2, Option: { ID: 0, Name: "Zero" } }
  ],         
  Options : [
    { ID: 0, Name: "Zero" },
    { ID: 1, Name: "One" },
  ]
};

var mapping = {
      'Parents': {
          create: function(options){
              options.data.Option = ko.observable(options.data.Option);
              return options.data;
          }
      }
  };

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

HTML 标记

<div data-bind="foreach: Parents">
  <p>
    <b data-bind="text: $data.ID"></b>
    <select name="x" data-bind="options: $parent.Options, optionsText: 'Name', value:   $data.Option"></select>
    <span data-bind="text: ko.toJSON($data)"></span>
  </p>
</div>

这是一个示例 jsfiddle http://jsfiddle.net/BvVce/11/

4

1 回答 1

1

我写了简单的递归映射函数。这就是你要找的东西:

var _json = {
  Parents : [
      { ID: 1, Option: { ID: 0, Name: "Zero" } },
      { ID: 2, Option: { ID: 0, Name: "Zero" } }
  ],         
  Options : [
    { ID: 0, Name: "Zero" },
    { ID: 1, Name: "One" },
  ]
};

function convertToObservable(obj) {
    var newObj = {},
        key,
        value;

    if (!$.isPlainObject(obj)) {
        return obj;
    }

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            value = obj[key];
            // console.log(key + ':', value);
            newObj[key] = $.isArray(value) 
                ? ko.observableArray($.map(value, convertToObservable)) 
                : $.isPlainObject(value) 
                        ? ko.observable(convertToObservable(value)) 
                        : ko.observable(value);
        }
    }
    return newObj;
}

var viewModel = convertToObservable(_json);
ko.applyBindings(viewModel);

在提琴手上查看:http: //jsfiddle.net/tkirda/BvVce/12/

于 2013-05-03T20:38:16.143 回答