2013-03-14 9 views
4

웹 페이지가로드 될 때 녹아웃 관찰 가능 배열에 초기 값이 채워지고 사용자가 상호 작용할 때 splice 메서드를 통해 관찰 가능 배열에 추가하려고합니다. 페이지와. 배열에 추가하려고하는 새 항목은 배열의 원래 항목과 완전히 동일한 속성을 갖지만 새 항목을 기존 배열에 연결하려고하면 넉 아웃 바인딩 오류가 발생합니다 (예 : "오류 : 바인딩을 구문 분석 할 수 없습니다. 메시지 : ReferenceError : ContactName이 정의되지 않았습니다. 바인딩 값 : 텍스트 : ContactName ". 새 배열의 모든 항목에 해당 속성이 존재하더라도이 오류가 발생합니다. 바인딩을 자동으로 업데이트되기를 원하기 때문에 기본 배열 객체가 아니라 녹아웃 관측 가능 배열에서 스플 라이스를 수행하려고합니다. 스플 라이스 코드는 다음과 같습니다 : vmContacts.Contacts.splice(vmContacts.Contacts().length,0,contactData2);.기존의 녹아웃 관측 가능 배열에 새로운 배열 배열을 연결하면 바인딩 오류가 발생합니다.

실제 피싱 예제를 만들었습니다. 즉, http://jsfiddle.net/ak47/pMFwe/입니다. 연락처 추가 버튼을 클릭하면 브라우저 콘솔에 오류가 표시됩니다.

필자는 추가해야 할 각 항목에 대해 push()를 수행하는 새로운 객체 배열을 반복하지 말고 splice가 작동해야하는 곳을 피하고 싶습니다. Knockout에서 알려진 이슈입니까? 아니면 잘못된 것입니까? 도와 주셔서 감사합니다!

답변

6

을 : 마찬가지로

var contactData2 = ko.mapping.fromJSON(contactJSON1); 

, 당신이 배열에 각 하나를 추가 할 foreach 루프를 사용하여 나갈 수 있다고 생각하지 않습니다 : 그렇게하기 위해 mapping plugin를 사용하여 contactData2Array.splice의 세 번째 매개 변수이지만 Array.splice은 세 번째 매개 변수로 배열을 지원하지 않습니다. documentation을 참조하십시오.

그래서 당신은

vmContacts.Contacts.splice(vmContacts.Contacts().length, 0, 
    contactData2[0], contactData2[1], contactData2[2], contactData2[3]); 

같은 것을 쓸 필요가 또는 "가입"당신의 두 배열하기 위해 당신은 apply과 함께 push를 사용할 수 있습니다

vmContacts.Contacts.push.apply(vmContacts.Contacts,contactData2); 

데모

+0

지구촌 어디에서 신청 했습니까?!? :) –

+0

푸시의 Systax는'array.push (element1, ..., elementN)'이고'apply'는 다음과 같은 함수를 호출 할 수 있습니다 :'theFunction.apply (valueForThis, arrayOfArgs)'http : // stackoverflow 참고. .com/questions/1986896/what-is-the-the-difference-between-call-and-apply – nemesv

+0

나는 그것을 몰랐다, 고마워! :) –

0

observables가있는 뷰 모델을 만들지 않고 JSON을 파싱하여 JS 객체로 만듭니다. 당신은을 통과하려고

var contactData2 = ko.mapping.fromJSON(contactJSON2); 
ko.utils.arrayForEach(contactData2(), function(item) { 
vmContacts.Contacts.push(item); 
+0

JSFiddle. 감사합니다 응답을 위해, 필자의보기에서 뷰 모델은 관찰 가능한 배열을 가진 ContactsViewModel이다. JSON 문자열을 일반 JS 배열로 파싱하는 것이 맞지만 viewmodel의 관측 가능한 배열에이 문자열을 넣을 것입니다. 맵핑 플러그인은 개별 배열 항목을 관찰 가능하게 만들고 싶을 때만 필요합니다. – AK3800