2012-06-11 4 views
0

내 뷰 모델에 개체 컬렉션이 있습니다. select 컨트롤에 값을 바인딩 할 때 문제가 발생합니다. 값은 JS 객체이며 기본 유형이 아닙니다. 바운드 컬렉션에 둘 이상의 개체가 있고 select 컨트롤을 변경하면 다른 모든 개체의 값이 새로 선택된 개체로 업데이트됩니다. 모든 값이 foreach 바인딩 내부의 동일한 인스턴스에 바인딩되어있는 것과 같습니다. 오류는 새 행을 삽입 할 때 발생하며 기존 행을 편집 할 때만 발생하는 것 같습니다.한 개체의 관찰 가능한 속성 변경 컬렉션의 모든 개체의 변경 속성

나는 많은 복잡한 것들을 제거하고 JSFiddle에서 문제를 보여주는 예제를 가지고있다.

http://jsfiddle.net/zero21xxx/5vgDy/

단계 오른쪽 아래 새로운 드롭에서 "2"를 선택

  • 1 행의 드롭 다운에서 오류를

    1. 선택 정착 유형을 볼 수 있습니다.
    2. 행 2의 드롭 다운에서 Settle Type을 선택하십시오.
    3. 선택 상자에서 행 1과 행 2가 둘 다 "One"로 설정됩니다.

    한 행의 변경이 다른 행에 영향을주지 않을 것으로 예상됩니다. 내가 코드에, 그것을 보여줄 것을 추가하는 경우

    그것은 모든 조금 복잡한 그것을 설정, 문제가 있지만, 내 생각, 당신의 ID를 예상하지 않는 어떤 것을,

    function getValues(tabId) { 
           console.log("tabId " + tabId); 
           if (lookUp[tabId]) { 
    

  • 답변

    1

    있어 당신이 한 방법 동일한 tabId, 이는 당신이 그것을 보면서 같은 대상을 다루는 것을 의미합니다.

    나는 각각의 시간에 getValues을 변경하는 경우가

    function getValues(tabId) { 
           console.log("tabId " + tabId); 
           return [new DatabaseField(nextId(), "Name", "Attorney Name", DataType.STRING.id), 
                      new DatabaseField(nextId(), 
    "Type", "Settle Type", DataType.DROPDOWN.id)]; 
    } 
    

    도 내가

    다음이 작동하는 것 같다 ... [] 관찰 배열에 함께 모든 관찰 가능한 변화한다. 피들 ... http://jsfiddle.net/keith_nicholas/wmxJX/

    1

    selectedDatabaseField을 선택할 때마다 availableOptions.options을 다시 작성합니다. 각 행은 선택 항목과 동일한 옵션에 바인딩됩니다. 옵션이 다시 작성되면 각 행의 선택된 값은 더 이상 유효하지 않습니다.

    개체가 완전히 똑같아 보이는 경우에도 동일한 개체에 대한 참조가 아니면 개체가 동일하지 않습니다.

    따라서 옵션이 변경되고 현재 선택된 값이 더 이상 유효하지 않으므로 value 바인딩은 optionsCaption이 지정되어 있지 않으면 첫 번째 옵션을 값으로 할당합니다.

    옵션이 이미 빌드되어 있거나 동일한 데이터베이스 필드 객체에 대한 바인딩이 아닌 각 행에 대해 별도의 옵션을 원할 경우 옵션을 다시 작성하기를 원하지 않을 것입니다.

    +0

    이 문제를 해결하기 위해 코드 변경의 관점에서 무엇을 제안 하시겠습니까? 나는 결국'DatabaseField' 정보를 캐시하고 싶습니다. 왜냐하면 결국 서버를 때리기 때문입니다. 또한 왜이 같은 효과가'availableTabs'와 관련하여 발생하지 않습니까? 'foreach'에있는 모든 항목은 부모의 탭 목록에 바인딩되지만 테이블의 다른 행에 영향을주지 않고 변경할 수 있습니다. – arb

    +1

    아마도 다음과 같이 될 수 있습니다. http://jsfiddle.net/rniemeyer/5vgDy/54/. 옵션이 매번 필드에 채워지기보다는 필드에 이미 채워 졌는지 확인하십시오. –

    관련 문제