2012-10-24 2 views
0

나는 녹아웃의 초기 버전에서 응용 프로그램을 구축하고 코드처럼 보였다 :knockoutjs는 오브젝트 클론이거나 동일한 것을 참조합니까?

this.activeProducts.remove(function(item) { //some code }) 
I가 activeProducts를 재설정 할 수 있었다

: 나는 같은 activeProduct 배열에서 항목을 필터링 경우

var ProductCollection = function(products, metadata) { 
     var self = this; 
     this.allProducts = products; 
     this.activeProducts = ko.observableArray(products); 

모든 제품은 다음과 같이 처리합니다.

this.activeProducts(this.allProducts); 

하지만 이제는 제거 제품 위에있는 제거 기능을 수행하는 것처럼 보입니다. allProducts 또한 ... 내가 통과하고 동일한 참조 또는 다른 것과 연결되는 제품입니까? 나는 왜 이것이 지금 일어 났는지, 전에는 일어나지 않을 것입니다. 나는 이것을 유지할 수 있기를 바랄뿐입니다. 활성 제품과 this.allProducts는 별도의 배열로 있습니다.

+2

'products'는 두 경우 모두 동일한 배열입니다. 'activeProducts'가 배열의 복사본이되도록 ('products.slice (0)'이 빠른 방법입니다.) 또는'computed' observable을 사용하여 필터링 된 제품 버전을 나타낼 수 있습니다. –

답변

2

실험 결과에 따르면 ko.observableArray()은 기본 배열을 단순히 래핑합니다. 기본 배열을 복제 한 다음 새 인스턴스를 만듭니다.

객체 어레이에 observableArray 트랙 ...

observableArray 그냥 보유 개체 및 개체가 추가 될 때 청취자에게 통지되는 트랙이나 :

여기서 상기 Knockout documentation에서 더 제거 ...

... 당신은 ... 매개 변수가없는 함수로 observableArray를 호출하여 기본 자바 스크립트 배열을 얻을 수

기술적으로 당신은 당신이 정말로 궁금하면, 자바 스크립트 복제에 전념 전체 질문이있다 ... 또한, 그 기본 배열에서 작동하도록


// Thanks @RP Niemeyer 
this.activeProducts = ko.observableArray(products.slice(0)); 

// Deep copy with jQuery 
this.activeProducts = ko.observableArray(jQuery.extend(true, {}, products)); 

을 기본 자바 스크립트 배열 함수 중 하나를 사용할 수 있습니다 over here.

+0

답장을 보내 주셔서 감사합니다. 이전 버전의 Knockout이 실제로 데이터를 복제했는지 알 수 있습니까? 위에 표시된 것처럼 복제 할 필요없이 복제 작업을 마치 한 것처럼 작동합니다. – michael

+0

@ 마이클 : 음 ... 나는 그것을 의심합니다. Knockout은 가벼운 JavaScript 라이브러리를 목표로하고 있으며 문서에서 명시 적으로 그렇게하지 않는다면 라이브러리가 사용자를 대신하여 배열을 복제 할 것입니다. –

관련 문제