2014-07-12 3 views
1

유사하지만 다른 데이터에 대해 두 번째 AJAX 요청을 발행 한 후 기존 observableArray에 추가하는 방법을 알아내는 데 문제가 있습니다.다른 observableArray의 값을 KnockoutJS의 기존 observableArray에 병합

내 첫 번째 JSON 요청에 value 유형이 없으므로 추가해야합니다. 내 초기 JSON 구조 :

나머지 서버에서 서비스의 가동 시간을 얻는 두 번째 AJAX 요청이 발행

[{"statusmsg":"OK","data":{"status":"stopped"},"sender":"hostname","statuscode":0}]

:

[{"statusmsg":"OK","data":{"value":"","fact":"some_fact"},"sender":"hostname","statuscode":0}

내가 중첩 된 객체 data에 추가 할 유형 value이며 some_fact을 포함합니다.

ko.utils.arrayForEach(self.rows(), function(row) { 
    ko.utils.arrayForEach(self.timeRows, function(time) { 
     if(row.sender() == time.sender()) { 
     self.rows()[0].data.push({value: time.data.value()}); 
     } 
    }); 
}); 

참고 :

나는 다음과 같은 시도 나는 시험만을위한 자리 표시 자 인덱스 0을 사용하고 있습니다. 이상적으로는 호스트 이름을 기준으로 일치 항목을 찾고 observableArray을 업데이트하고 싶습니다.

이 코드가 실행, 나는

TypeError: self.rows(...)[0].data.push is not a function

가 나는 또한 data().push처럼 다음 data에 괄호를 넣어 시도하는 오류가 발생하지만, 그 중 하나가 작동하지 않았다.

observableArrayrows이라는 새로운 값을 추가하여 새 정보로 내보기를 업데이트 할 수 있습니다.

+0

뷰 모델에서'rows'를 정의한 방법에 따라 다릅니다. ko.observableArray()에 래핑 된 JS 객체의 단순한 배열입니까? 서버에서받은 데이터에 ko.mapping.fromJSON() 또는 ko.mapping.fromJS()를 사용 했습니까? 모델 매핑을보기 위해 자신 만의 맞춤형 모델을 만들었습니까? – Sybeus

+0

@ 시베스 : 나는 ko.mapping.fromJSON을 사용했습니다. 나는 커스텀 모델을 만들지 않았다.하나의 ViewModel – Brian

답변

0

을, 나는 @Sybeus' answer를 사용하지만 내 행 내 UI에서 업데이트되지 않은 것을 깨달았 때문에 내 UI가 이전 버전의 행에 바인딩되었습니다. 나는 더미 가입자를 만들고 알리려고해도 내 계산 관찰 행이, 그것은 여전히 ​​this answer에 설명 된대로 이전 행에 바인딩 된 업데이트 된 것을 : 그래서

If you would want to replace the array you should probably create a replacement array, push tweets into that array and finally replace the array in the observableArray by doing self.tweets(replacementArray);.

나는 다음과 같은 한해야 할 일을했을 것 :

self.updateServiceStartTime = function() { 
    var url = "url"; 

    $.ajax({ 
    method: "GET", 
    url: url, 
    success: function(data) { 
     var observableData = ko.mapping.fromJSON(data); 
     var array = observableData(); 
     self.timeRows(array); 

     ko.utils.arrayForEach(self.rows(), function(row) { 
      ko.utils.arrayForEach(self.timeRows(), function(time) { 
       if(row.sender() == time.sender()) {      
       if (time.data.value()) { 
        row.data.value = time.data.value; 
       } 
       else { 
        row.data.value = "No time found yet."; 
       } 
       } 
      }); 
     }); 
     self.cloneRows(self.rows().slice()); 
     self.rows.removeAll(); 
     self.rows(self.cloneRows().slice()); 
    } 
    }); 
    }; 

이렇게하면 UI가 내가 추가 한 새 데이터로 업데이트됩니다.

3

기본 녹아웃 매핑을 선택 했으므로 연관 배열이 속성이있는 단순한 객체라고 가정하므로 push 프로토스 함수와 같은 배열 프로토 타입 함수가 없습니다. 이미 rowself.rows()에 있으므로 색인 참조가 필요하지 않습니다. 그러니 그냥 단순히 일치 row 개체의 '데이터'하위 개체의 value 속성 설정 : 내 문제를 해결하기 위해

ko.utils.arrayForEach(self.rows(), function(row) { 
    ko.utils.arrayForEach(self.timeRows, function(time) { 
     if(row.sender() == time.sender()) { 
     row.data.value = time.data.value; 
     } 
    }); 
}); 
+0

와우, 네가 할 수 있는지 몰랐다. 나는 당신이 그것을 어떻게 든 생성해야만했던 첫 번째 집합에 가치가 존재하지 않았기 때문에 생각했습니다. – Brian

+0

JavaScript의 가장 강력한 기능 중 하나입니다. 기존 객체에 속성 및 기능을 동적으로 추가 할 수 있습니다. – Sybeus

+0

도움을 준 후에 내가해야 할 일을 보려면 아래의 나의 대답을보십시오. – Brian