Knockout双向绑定嵌套数组

时间:2013-03-19 15:39:36

标签: knockout.js

我遇到麻烦让绑定工作为嵌套数组。页面首次加载时显示的值正确,但是当我进行编辑时,绑定的对象不会更新。

我在这里创建了一个jsfiddle:http://jsfiddle.net/coverbeck/qCzT6/1/

我的HTML是这样的:

<body>
    <ul>
<!-- ko foreach: {data: cities, as: 'city'} -->
        <li>
           <input data-bind="value: city.name"/>
           <span data-bind="text: city.name"></span>
        </li>
    <ul>
    <!-- ko foreach: {data: neighborhoods, as: 'neighborhood'} -->
        <li>
            <input data-bind="value: neighborhood"/>
            <span data-bind="text: neighborhood"></span>
        </li>
    <!-- /ko -->
    </ul>
<!-- /ko -->
</ul>
</body>

我的JavaScript是:

var sf = {name: ko.observable('San Francisco'),
          neighborhoods: ko.observableArray([
                ko.observable('Haight'), 
                ko.observable('Bayview'), 
                ko.observable('Marina')
           ])
         }; 
var ny = {name: ko.observable('New York'),
          neighborhoods: ko.observableArray([
                ko.observable('Hells Kitchen'), 
                ko.observable('Times Square')
            ])
          };

var cities = ko.observableArray([sf, ny]);
var viewModel = { cities: cities };
ko.applyBindings(viewModel);

修改城市名称时,相应的span元素会更新。当我修改邻居名称时,相应的span元素不会更新。

我已经问了一个类似的问题here,答案很有效。我似乎又遇到了同样的问题,除了这次它是一个嵌套数组,我看到了问题。我在针对嵌套数组的答案中尝试了修复,但在这种情况下似乎没有什么区别。

谢谢,

查尔斯

1 个答案:

答案 0 :(得分:2)

我不确定问题的确切位置,但可以这样解决:

var ny = {name: ko.observable('New York'), 
          neighborhoods: ko.observableArray([
              new neighborhood('Hells Kitchen'), 
              new neighborhood('Times Square')])};

function neighborhood(name) {
    this.name = ko.observable(name);
}

然后绑定foreach neighborhoods,然后绑定到name。问题可能是它不喜欢没有名字的observable?

工作fiddle here