2013-02-08 33 views
0

我處理相當大數量的JSON和數據是這樣的:大嵌套的JSON數據並更新DOM時改變

{ 
    "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" 
      } 
     } 
    ] 
} 

每當我改變什麼,我得到一個新的響應這有點類似以前的數據,但可能已添加新的屬性,可能已刪除的東西,等等。

我testcode是這樣(不介意這裏的不良行爲無限量):

<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> 

我想要的東西[「嵌套啄」]每當東西被更新進行更新。我如何在沒有任何映射的情況下做到這一點,並讓所有事情都可觀察?

回答

1

你應該只需要更新您的招標:

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

你要訪問的值()的可觀察性。這返回你的對象,然後你可以訪問它。綁定的內容仍然依賴於可觀察的東西,因此它應該在更新東西時更新。

至少我的小提琴正在這樣: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()); 
0

任何你無法使用mapping plugin來處理你的映射的原因?您可以使用屬性複製選項,你不想進行觀測:

var mapping = { 
    'copy': ["propertyToCopy"] 
} 
var viewModel = ko.mapping.fromJS(data, mapping); 
+0

這似乎對矯枉過正給我。我不想在0.6 MB的JSON上擁有數百個數據綁定對象,每個頁面上都會更新10次或更多。我也擔心一遍又一遍數據綁定這麼多的數據會很慢。有人能在這裏詳細說明嗎? –

+0

那麼,你可以使用忽略屬性來複制你關心的那部分頁面的數據。我認爲你的例子是過度簡化的,你想要綁定到嵌套對象中的不止一個屬性? –

+0

是的,根據您正在瀏覽的頁面,可能會或可能不會使用JSON響應中的所有內容。有什麼方法可以告訴Knockout一個對象被更改,並且所有使用後代屬性或數組的對象都應該被更新? –