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>

我希望东西['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 回答