0

これがうまくいかない理由を誰か説明できますか?

function MyViewModel() {
    var data = [
        { forename: "Bob", age: 23 }, 
        { forename: "Alex", age: 19 }, 
        { forename: "Joe", age: 67 }
    ];
    var persons = ko.observableArray(data);
    useForEach = function () {
        ko.utils.arrayForEach(persons, function (item) {
            item.age(99);
        });
    };

    return {
        persons: persons,
        useForEach: useForEach
    }
}

var vm = new MyViewModel();
ko.applyBindings(vm);

ビューで年齢が更新されることを望んでいますが、何も起こりません....ここに私のビューがあります:

<button data-bind="click: useForEach ">useForEach</button>

<table>
    <thead>
        <tr>
            <th>Forename</th>
            <th>Age</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: persons">
        <tr>
            <td data-bind="text: forename"></td>
            <td data-bind="text: age"></td>
        </tr>
    </tbody>
</table>
4

2 に答える 2

2

observableArray配列にアクセスするには、ラップを解除する必要があります。また、年齢プロパティは観察できないため、そのような方法で値を割り当てることはできません。オブザーバブルに変換するか、 を使用して値を割り当てる必要があります=

useForEach = function () {
    ko.utils.arrayForEach(persons(), function (item) {
        item.age = 99;
    });
};

すべてのプロパティが監視可能である「人」の別のクラスを追加することをお勧めします。

function Person(name, age){
    var self = this;

    self.forename = ko.observable(name);
    self.age = ko.observable(age);
}    

function MyViewModel() {
    var data = [new Person("Bob", 23), new Person("Alex", 19), new Person("Joe", 67)];
    var persons = ko.observableArray(data);
    useForEach = function () {
        ko.utils.arrayForEach(persons(), function (item) {
            item.age(99);
        });
    };

    return {
        persons: persons,
        useForEach: useForEach
    }
}

ここにフィドルが働いています:http://jsfiddle.net/Hn5we/1/

于 2013-11-01T08:45:41.660 に答える