0

私はかなり大量のjsonを扱っており、データは次のようなものです。

{
    "name": "John Smith",
    "age": 32,
    "employed": true,
    "address": {
        "street": "701 First Ave.",
        "city": "Sunnyvale, CA 95125",
        "country": "United States"
    },
    "children": [
        {
            "name": "Richard",
            "age": 7,
            "field": {
                "field": "value"
            }
        }
    ]
}

何かを変更するたびに、以前のデータにいくらか似ている新しい応答が返されますが、新しいプロパティが追加された可能性がある場合は、ものが削除された可能性があります。

私のテストコードは次のようなものです(ここでは無数の悪い習慣を気にしないでください):

<div data-viewmodel="whatevz">
    <span data-bind="text: stuff['nested-thingy']"></span>
</div>
<script>
    function vm() {
        var self = this;
        this.stuff = ko.observable();

        require(["shop/app"], function (shop) {
            setTimeout(function () {
                self.stuff(shop.stuff);
            }, 1200);
        });
    }

    ko.applyBindings(new vm(), $("[data-viewmodel]")[0]);
</script>

stuffが更新されるたびにstuff['nested-thingy']が更新されるようにしたい。あらゆる種類のマッピングを行わず、すべてを観察可能にすることなく、これを行うにはどうすればよいですか?

4

2 に答える 2

1

入札を更新するだけで済みます。

<div data-viewmodel="whatevz">
    <span data-bind="text: stuff()['nested-thingy']"></span>
</div>

()を使用してobservableの値にアクセスする必要があります。これでオブジェクトが返され、アクセスできるようになります。バインディングの内容は依然として監視可能なものに依存しているため、更新されるたびに更新する必要があります。

少なくとも私のフィドルはそのように機能しています:http://jsfiddle.net/delixfe/guM4X/

<div data-bind="if: stuff()">
    <span data-bind="text: stuff()['nested-thingy']"></span>
</div>
<button data-bind="click: add1">1</button>
<button data-bind="click: add2">2</button>

に注意してくださいdata-bind="if: stuff()。これは、バインド時以降にコンテンツのコンテンツが空の場合に必要です...

function Vm() {
    var self = this;
    self.stuff = ko.observable();

    self.add1 = function () {
        self.stuff({'nested-thingy': "1"});
    };

    self.add2 = function () {
        self.stuff({'nested-thingy': "2"});
    };        


}

ko.applyBindings(new Vm());
于 2013-02-08T20:50:49.817 に答える
0

マッピングプラグインを使用してマッピングを処理できない理由はありますか?監視可能にしたくないプロパティには、コピーオプションを使用できます。

var mapping = {
    'copy': ["propertyToCopy"]
}
var viewModel = ko.mapping.fromJS(data, mapping);
于 2013-02-08T11:50:30.943 に答える