2013-02-08 2 views
0

내가 JSON의 꽤 큰 금액을 처리하고있어 데이터가이 같은 것입니다 : 난 아무것도 변경할 때마다큰 중첩 된 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> 

내가 원하는 물건 [ '중첩-꼬추'] 물건이 업데이트 될 때마다 업데이트 할 :

내 testcode는 다음과 같이 (여기 나쁜 관행의 무한한 양을 상관하지 않습니다)입니다. 모든 종류의 매핑없이 모든 작업을 관찰하고 관찰 할 수있는 방법은 무엇입니까?

답변

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

그냥 지나친 것 같습니다. 나는 모든 페이지에서 10 번 이상 업데이트 될 0.6MB의 JSON에 수백 개의 databound 중첩 된 객체를 갖고 싶지 않습니다. 너무 많은 데이터를 반복해서 데이터 바인딩하는 것이 느려지는 것도 두렵습니다. 누군가 여기서 정교 할 수 있습니까? –

+0

음, 무시 속성을 사용하여 페이지의 해당 섹션에 대해 관심있는 데이터 만 복사 할 수 있습니다. 당신의 예제가 지나치게 단순화되어 있고 중첩 된 객체의 속성 하나 이상에 바인딩하고 싶습니다. –

+0

예, 현재 사용중인 페이지에 따라 JSON 응답의 모든 내용이 사용되거나 사용되지 않을 수 있습니다. knockout에게 객체가 변경되고 자손 속성이나 배열을 사용하는 모든 것이 업데이트되어야한다고 말할 수있는 방법이 있습니까? –

관련 문제