갤러리는 다른 컨트롤을 만들 수 있는 유일한 컨트롤입니다. 자체 범위가 있습니다. 이러한 고급 기능은 갤러리가 올바르게 구성되지 않은 경우 예기치 않은 동작으로 이어질 수 있습니다. 이 도움말에서는 갤러리 작업 시 모범 사례와 권장 사항을 다룹니다.
갤러리 내에서 갤러리 항목을 변경하지 마세요.
하위 컨트롤의 OnChange 또는 OnSelect가 상위 갤러리의 항목을 수정하는 경우 불안정한 동작이 발생하기 쉽습니다. 예를 들어 갤러리의 텍스트 입력은 OnChange 속성을 다음과 같이 설정할 수 있습니다.
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
일반적으로 괜찮습니다. 대부분의 컨트롤은 사용자가 값을 직접 변경할 때만 OnChange를 트리거합니다. 그러나 이러한 컨트롤은 시스템이 해당 값을 변경할 때 OnChange도 트리거하므로 문제를 일으킬 수 있습니다.
예를 들어 ComboBox.DefaultSelectedItems가 변경되면 OnChange가 트리거됩니다.
DefaultSelectedItems가 First(ThisItem.A)로 설정되고 해당 OnChange 속성이 다음으로 설정된 갤러리의 콤보 상자를 생각해 보세요.
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
이 표현식은 현재 항목 이름과 일치하는 갤러리의 데이터 원본에 있는 레코드를 업데이트합니다. 변경 사항은 레코드의 A 열을 새 테이블로 바꾸는 것입니다.
이로 인해 무한 루프가 발생합니다. 사용자가 콤보 상자의 값을 변경하면 OnChange가 트리거되어 GalleryData가 업데이트되고, DefaultSelectedItems가 변경되고(First(ThisItem.A)는 새 테이블을 참조하기 때문에), OnChange가 다시 트리거되는 식입니다.
무한 루프를 방지하려면 최신 컨트롤 또는 데이터가 변경될 때 OnChange를 트리거하지 않는 기타 컨트롤을 사용할 수 있습니다.
항목 패치로 인한 성능 저하
원하지 않는 루프를 방지하더라도 갤러리에 항목이 많으면 갤러리 항목 패칭 또는 업데이트가 느려질 수 있습니다. 갤러리는 변경된 레코드와 관련된 행만 업데이트하지 않습니다. 어떤 경우에는 모든 항목을 다시 로드합니다. 이는 데이터 원본의 구조가 느슨하기 때문입니다. 갤러리에서는 단일 레코드만 변경되었는지 아니면 전체 데이터 원본이 변경되었는지 파악하기 어려울 수 있습니다.
Gallery.Selected는 예기치 않게 변경될 수 있습니다.
갤러리의 선택됨 속성은 움직이는 대상입니다. 다음과 같은 경우 사용자 상호 작용 없이 변경될 수 있습니다.
- Gallery.Default 변경
- Gallery.Items 변경
- 데이터 원본 새로 고침 또는 업데이트
이는 귀하의 시나리오에 바람직하지 않을 수 있습니다. 사용자가 선택한 항목의 안정적인 복사본을 원한다면 해당 항목을 변수에 저장하는 것이 좋습니다. 예를 들어 갤러리의 OnSelect 속성을 전역 변수 CurrentItem으로 설정합니다.
Set(CurrentItem, Self.Selected)
그런 다음 앱의 다른 부분에서 CurrentItem을 사용하여 시스템이 아닌 사용자가 선택한 가장 최근 항목을 참조할 수 있습니다.
하위 컨트롤 이벤트에서 Gallery.Selected를 사용하지 마세요.
사용자가 항목을 선택하면 갤러리의 선택됨 속성이 변경됩니다. 그러나 이 이벤트는 하위 컨트롤의 이벤트와 관련이 없습니다. 하위 컨트롤의 이벤트에서 Gallery.Selected를 참조하면 예상치 못한 결과가 발생할 수 있습니다.
예를 들어 사용자가 갤러리에서 확인란을 선택하면 다음 이벤트가 발생합니다.
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.Selected는 새로 클릭한 행으로 변경됩니다
이러한 이벤트의 순서는 고정되어 있지 않습니다.
Checkbox.OnSelect가 다음과 같이 설정된 경우 문제가 됩니다.
Notify(Gallery.Selected.Name)
Gallery.Selected은 Checkbox.OnSelect가 실행될 때 여전히 이전에 선택한 행을 참조할 수 있습니다.
타이밍 문제를 방지하려면 이벤트에서 Gallery.Selected를 사용하지 마세요. 꼭 필요한 경우 Gallery.OnSelect를 사용하여 Gallery.Selected에 대한 변경 사항에 응답하세요.
갤러리가 해당 항목의 스키마를 알고 있는지 확인하십시오.
Gallery.Items를 변수 또는 캔버스 구성 요소의 출력으로 설정하면 변수가 설정되거나 변경되는 시기에 따라 예상치 못한 결과가 발생할 수 있습니다.
갤러리는 앱이 로드될 때 항목의 스키마를 알아야 합니다. 셰이프라고도 하는 스키마는 데이터 원본에 있는 열의 이름과 유형입니다. 다음 테이블을 고려하십시오.
[{A: "abc", B: 123}, {A: "def", B: 456}]
해당 스키마는 텍스트 열 A과 숫자 열 B로 구성됩니다.
대부분의 경우 갤러리는 앱에서 사용되는 데이터 원본과 표현식을 통해 항목의 스키마를 추측할 수 있습니다. 그러나 항목 속성이 캔버스 구성 요소 또는 가져오기 컨트롤의 출력으로 설정된 경우 갤러리는 해당 스키마를 확인할 수 없습니다. 앱이 로드될 때 이러한 컨트롤의 출력 테이블을 사용하지 못할 수도 있고 스키마가 변경될 수도 있습니다. 갤러리는 해당 스키마를 모르는 경우 항목을 렌더링하지 않습니다.
항목이 앱이 로드될 때 초기화되지 않는 변수로 설정된 경우에도 동일한 문제가 발생할 수 있습니다.
해결 방법으로 변수를 사용하여 예상 스키마를 갤러리에 암시할 수 있습니다. App.OnStart를 다음으로 설정합니다.
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
이를 통해 시스템은 GalleryData 테이블의 스키마를 알 수 있습니다. 그런 다음 GalleryData를 갤러리의 항목 속성으로 사용할 수 있습니다. 필요한 경우 실제 데이터 원본으로 변경하세요.
AllItems에 데이터 세트의 모든 항목이 포함되어 있다고 가정하지 마세요.
AllItems 속성은 갤러리 보기에 로드되는 항목입니다. 항목의 모든 항목은 아닙니다. AllItems는 사용자가 갤러리를 스크롤하여 더 많은 항목을 로드할 때 변경될 수 있습니다. 일반적으로 이 속성은 사용자가 하위 컨트롤과 상호 작용할 때 하위 컨트롤의 값을 가져오는 데 사용됩니다. 따라서 AllItems는 해당 항목을 로드했음을 보장하며 이를 참조해도 안전합니다. 사용자가 항목을 보았는지 확실하지 않은 경우 AllItems의 항목을 참조하지 마세요.
마찬가지로, AllItemsCount는 갤러리 보기에 로드된 항목 수입니다.
항목의 총 레코드 수는 아닙니다.
항목의 전체 레코드를 가져오려면 CountRows(<expression used for Items property>)를 사용하세요.