2014-10-07 3 views
3

우리는 직렬화 된 데이터가 디스크의 파일에서 읽히는 WinJS의 응용 프로그램에 상황이 있습니다. 페이지에 따라 파일의 다른 섹션에 액세스합니다.WinJS - 두 번의 빠른 버튼 누르기 방지

우리가 가진 문제는 사용자가 컨트롤, 버튼,리스트 뷰 등을 두 번 탭하면 시스템이 파일을 두 번 읽으려고하고 산발적으로 폭발한다는 것입니다.

WinJS에서 컨트롤을 두 번 누르는 것을 방지하거나 처리하는 권장 경로가 있습니까? 누르면 모든 버튼을 수동으로 비활성화하고 다시 활성화하는 것과는 다른 것입니까?

addEventListener 무시를 포함하여 몇 가지 옵션을 살펴 보았지만 완벽하지는 않습니다.이 영역의 모든 제안은 크게 감사하겠습니다.

추가 :이 예제에서 문제는 파일을 읽는 동안 목록에 빠른 두 번 누르기를 수행하면 페이지를 두 번 탐색 한 다음 nav.history에 두 번 추가하려고하는 다른 응용 프로그램이 있으므로 이런 종류의 일이 발생할 수있는 장소와 증상이 많이있는 것처럼 보입니다.

+0

당신은 모든 버튼을 계속하기 전에 확인 "ProcessingValue"로 누를 때마다 설정되는 변수가 있을까요? –

+0

안녕하세요, 이것은 우리가 찾고있는 제안 중 하나입니다. 단점은 응용 프로그램의 여러 영역에서 동일한 코드를 여러 번 작성해야하거나 재정의 할 방법이 필요하다는 것입니다 addEventListener를 호출하고 모든 기본 리스너 함수가 약속을 반환하도록하기 때문에 완료 후 'processingvalue'를 다시 설정할 수 있습니다. – dougajmcdonald

답변

0

가장 좋은 방법은 처리 중에 버튼을 비활성화하고 완료되면 다시 활성화하는 것입니다. 이는 예상보다 오래 걸리면 사용자에게 적절한 피드백을 제공합니다.

수동으로 모두 설정하는 대신 데이터 바인딩을 통해 설정을 해제 할 수 있습니다.

HTML

<button id="button1" data-win-bind="disabled: disabled">Click</button> 
<button id="button2" data-win-bind="disabled: disabled">Click</button> 
<button id="button3" data-win-bind="disabled: disabled">Click</button> 
<button id="button4" data-win-bind="disabled: disabled">Click</button> 

자바 스크립트

var bindingSource; 

app.onactivated = function (args) { 
    if (args.detail.kind === activation.ActivationKind.launch) { 
     if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { 
      // TODO: This application has been newly launched. Initialize 
      // your application here. 
     } else { 
      // TODO: This application has been reactivated from suspension. 
      // Restore application state here. 
     } 
     args.setPromise(WinJS.UI.processAll()); 

     var disabledContext = { disabled: false } 

     var btn = document.getElementById("button1"); 
     btn.addEventListener("click", buttonClickHandler, false); 
     WinJS.Binding.processAll(btn, disabledContext); 

     btn = document.getElementById("button2"); 
     btn.addEventListener("click", buttonClickHandler, false); 
     WinJS.Binding.processAll(btn, disabledContext); 

     btn = document.getElementById("button3"); 
     btn.addEventListener("click", buttonClickHandler, false); 
     WinJS.Binding.processAll(btn, disabledContext); 

     btn = document.getElementById("button4"); 
     btn.addEventListener("click", buttonClickHandler, false); 
     WinJS.Binding.processAll(btn, disabledContext); 

     bindingSource = WinJS.Binding.as(disabledContext); 
    } 
}; 

function buttonClickHandler(eventInfo) { 
    bindingSource.disabled = true 

    WinJS.Promise.timeout(5000).then(function (c) { 
     bindingSource.disabled = false 
    }); 
} 

--Rob

+0

안녕하세요, 우리가 구현할 필요가있는 '사용 불가'동작이 약간 다른 언론, 버튼, 목록, 하이퍼 링크 등에서이 기능을 구현해야한다는 점을 제외하고는 나쁜 생각이 아닙니다. 또한 버튼을 누르는 동안 5 초의 시간 제한을 설정하면 버튼이 작동하는 시점을 알 수있는 효과적인 방법이 없다는 것을 제외하면 '아마'작동합니다. 중고품은 약속을 되 돌렸지 만, 어떤 사람들은 그렇게하지 못했고 많은 사람들은 이런 식으로 일하도록 모든 것을 바꾸는 것이 상당히 중요한 작업이었습니다. – dougajmcdonald

+0

5 초 제한 시간은 앱에서해야하는 작업의 자리 표시 자입니다. 당신은 진짜 응용 프로그램에서 그것을 원하지 않을 것입니다. 대부분의 컨트롤은 동일한 방식으로 사용 안 함으로 바인딩되며 바인딩 소스에 다른 속성을 포함시키고 비활성화/사용하도록 설정할 수있는 함수를 작성할 수 있습니다. 작업이 완료된 시점을 알 수 없으면 작업이 진행되는 동안 이중 액세스를 방지하는 모든 방법이 어려울 수 있습니다. –

+0

팁 : 약속이 오류 상태로 실행되거나 버튼이 영구적으로 비활성화되는 경우에도 사용 안 함을 false로 설정해야합니다. 아직까지는'WinJS.Promise.finally' 메소드가 빠져있는 경우에 완벽한 경우입니다. 그럼'WinJS.Promise.timeout (5000) .finally (function() {bindingSource.disabled = false;});' – philk