2012-03-29 9 views
0

내가 여기에 문제의 예 만든 업데이트 될 때 테이블이 업데이트되지 :KnockoutJS - 배열

내 실제 코드가 ASP.NET 웹 방식에 매여있다 http://jsfiddle.net/JustinN/qWeLT/1/

때문에, 예를 들어 코드를 공공 웹 서비스를 시연하기 위해 조정되었습니다.

기본적으로, 나는 바인딩하는 배열을 가지고 있지만, Ajax 호출 후에 테이블에는 업데이트 된 정보가 표시되지 않습니다. 내가 무엇을 놓치고 있는지 잘 모르겠다. 처음에는 맵핑 플러그인이 필요하다고 생각 했으므로 시도했지만 아직 어디에도 가지 않았다.

확실히 데이터를 변경할 때마다 바인딩을 적용 할 예정이 아니십니까?

[편집]

자바 스크립트 아래 아래

var ViewModel = function() { 
var self = this; 
self.items = ko.observableArray([]); 
self.refresh = function() { 
    $.ajax({ 
     type: "POST", 
     url: "http://api.wipmania.com/json", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (data) { 
      ko.mapping.fromJS(data.d, self.items.address); 
     } 
    }); 
}; 
} 

var viewModel = new ViewModel(); 
$(function() { 
ko.applyBindings(viewModel); 
viewModel.refresh(); 
}); 

HTML :

<table data-bind="visible:items.length > 0"> 
<thead> 
    <tr> 
     <th>Country</th> 
     <th>Code</th> 
    </tr> 
</thead> 
<tbody data-bind="foreach: items"> 
    <tr> 
     <td data-bind="text:country"></td> 
     <td data-bind="text:country_code"></td> 
    </tr> 
</tbody> 
</table> 
+0

죄송합니다. 코드를 붙여 넣기했지만 JSFiddle 예제를 항상 요구했습니다. 나는 이제 둘 다 포함 할 것이다. - 편집 및 수정. – JustinN

+0

이 행에'.address '가 무엇입니까? 'ko.mapping.fromJS (data.d, self.items.address); ' – Niko

+0

좋은 거래. 예, 복사하여 붙여 넣는 것이 가장 좋습니다 (사람들이 얼마나 자주 다시 입력하는지 놀라움).) 및 부가 기능 *으로 라이브 링크 (http://jsbin.com을 선호하지만 맛의 문제)가 좋습니다. –

답변

2

체크 아웃이 바이올린 : 모든 http://jsfiddle.net/Gm7zH/1/

우선 때문에 크로스 도메인 요청의 가짜 아약스 데이터를 사용하고 있습니다. 그것은 서버에서 가져온 데이터입니다. 그리고 setTimeout을 사용하여 비동기 요청을 시뮬레이트합니다.

존재하지 않는 배열의 속성 주소에 매핑 할 :

은 그럼 당신은 오류의 수를 않습니다. 두 번째로 결과의 주소는 객체 일 뿐이므로이를 배열로 묶어 작동하게 만듭니다.

그런 다음 기존 observableArray에 매핑하려고 시도하지만 배열을 두 번째 인수로 제공하면 두 번째 인수가 매핑 옵션이고 세 번째 인수가 올바른 위치입니다. 내 예제에서는 매핑 옵션으로 null을 전달합니다.

마지막으로 표가 보이도록하려면 items.length> 0이라고 말하십시오. 원하는 것은 items(). length> 0이며 기본 배열의 길이입니다.

+0

수정 된 예제와 예제를 제공해 주신 Martin에게 감사드립니다. 제 코드를 수정하는 데 사용했으며 지금은 아름답게 작동합니다! 내 첫 질문에 올린 끔찍한 모범에 대한 모든 사과, 앞으로 더 명확한 샘플을 제출하려고 노력할 것입니다. – JustinN

0

귀하의 배열이 self.items입니다,하지만 아약스 success 호출 내가 추측하고있어 self.items.address를 업데이트하고 undefined입니다. 그래서 매핑 플러그인은 새로운 모델을 생성합니다. 원본과 관련이 없습니다. 확실히 내가 applyBindings에 때마다 내 데이터 변경을 의미하고 있지 않다

(당신의 모습 data.d 표시하지 않은,하지만 나는 그것을 배열입니다 있으리라 믿고있어.)?

수정. 그렇게하면 관측 값을 업데이트하면 DOM을 업데이트해야합니다.

+0

내 문제를 설명하기 위해 채찍질 한 내보기와 같이 여러 가지 문제가 있습니다. .address는 혼란에 대해 self.items - apologies가 아닌 data.d.address에 있어야합니다. 그러나 문제는 불행히도 없습니다. – JustinN