向可观察对象动态添加属性

use*_*317 8 knockout.js

我有一个像这样的viewmodel,

        function viewModel() {
            this.loadData = function() {
                this.Items().C = 3;
            };

            this.Items = ko.observable({ A: 1});
            this.Items().B = 2;
        }

        var vm = new viewModel();
        ko.applyBindings(vm);
        vm.loadData();
Run Code Online (Sandbox Code Playgroud)

我打印出这样的值,

        <span data-bind="text: $root.Items().A"></span>
        <span data-bind="text: $root.Items().B"></span>
        <span data-bind="text: $root.Items().C"></span>
Run Code Online (Sandbox Code Playgroud)

它打印出A和B的值,但不打印C?

谢谢.

RP *_*yer 10

由于C最初本身不可观察,因此绑定不会知道在进行更改时需要更新.

要进行更新,您需要Items完全重置:

this.loadData = function() {
    var existing = this.Items();
    existing.C = 3;
    this.Items(existing);
};
Run Code Online (Sandbox Code Playgroud)

或调用valueHasMutatedobservable 的函数,强制任何订阅者更新如下:

this.loadData = function() {
    this.Items().C = 3;
    this.Items.valueHasMutated();
};
Run Code Online (Sandbox Code Playgroud)