2013-04-13 2 views
2

Windows 8 HTML5 앱을 만들고 앱 표시 줄을 구현 중입니다. appbar.winControl에 액세스하면 항상 null입니다. 예를 들어 appbar.winControl.show()를 작성하면 winControl이 null이라는 예외가 발생합니다.winjs appbar.wincontrol is null

고정 레이아웃 애플리케이션을 만들었습니다. 다른 아무것도하지 않고, 나는 문서 본문에 다음과 같은 마크 업을 추가 :

<body> 
<div id="appbar" data-win-control="WinJS.UI.AppBar" aria-label="Command Bar"> 
    <button id="btnBoardSizeUp" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Larger', icon:'zoomout', section:'global', tooltip:'Increase the board size'}" /> 
    <button id="btnBoardSizeDown" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Smaller', icon:'zoomin', section:'global', tooltip:'Decrease the board size'}" /> 
    <button id="btnAbortGame" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Abort', icon:'cancel', section:'selection', tooltip:'Abort the current game'}" /> 
</div> 

<script type="text/javascript"> 
    var appbar = document.getElementById("appbar"); 
    var winControl = appbar.winControl; 
    winControl.show(); 
</script> 

라인 winControl.show() 다음과 같은 오류 발생 :

0x800a138f - 자바 스크립트 런타임 오류 : 없음에 정의되지 않은 또는 null 참조의 'show'속성을 얻으십시오.

내가 볼 수있는 한, 페이지에서 appbar를 올바르게 구현 했으므로 제대로 작동해야합니다. 어떤 생각이 잘못 되었습니까?

답변

3

페이지 컨트롤이 아직 초기화되지 않았으며 스크립트가 그 전에 실행 중입니다.

이 코드를 삽입 할 수있는 장소는 두 곳입니다. 중 당신이 winjs 제어 (데이터 - 윈 ​​제어 속성 DIV) 당신이 원하는 컨트롤을 지정을 사용할 때마다

// if the app bar is part of default.html, appbar show can be put in default.js 
// default.js already have a call to WinJS.UI.processAll under activated event handler 
WinJS.UI.processAll().then(function() 
{ 
    appbar.winControl.show(); 
}); 

또는

// if the appbar is part of mypage.html, need to have code like this in mypage.js 
WinJS.UI.Pages.define('/pages/mypage/mypage.html', 
    { 
     ready: function onready(element, options) 
     { 
      appbar.winControl.show(); 
     } 
    } 
+0

감사합니다. @ 수필. 첫 번째 예제가 작동하지 못했습니다. 대신 processAll 함수가 존재하지 않는다는 오류가 발생합니다. 그러나 두 번째 예제는 완벽하게 작동했기 때문에 문제가 해결되었습니다. –

+0

나는 그것을 고쳐야 만한다.이제는 두 exmples를 모두 사용할 수 있습니다. 왜 첫 번째 예제가 더 일찍 작동하지 않았는지 모르겠지만, 그 부분에서 타이핑 오류가 발생했을 수 있습니다. 어쨌든 다시 감사합니다, @Sushil –

1

인치 JavaScript 코드에서 WinJS.UI.processAll 함수를 호출해야합니다. WinJS.UI.processAll은 마크 업을 파싱하고 찾은 JavaScript 컨트롤 용 Windows 라이브러리를 인스턴스화합니다. 당신이 빈 응용 프로그램 템플릿을 사용하지 않는 또는 당신은 당신이 직접 만든 페이지에 컨트롤을 추가
이라면, 당신은
은 WinJS.UI.processAll에 대한 호출을 추가해야 할 수 있습니다

  1. . 앞의 예에서와 같이 (일반적으로 default.html을 파일입니다) 앱의 홈 페이지에 컨트롤 을 추가 한 경우
  2. , , 당신의 onactivated 이벤트 핸들러에서 WinJS.UI.processAll에 대한 호출을 추가
  3. 페이지 컨트롤에 컨트롤을 추가 한 경우 WinJS.UI.processAll에 대한 호출을 추가 할 필요가 없습니다. 페이지 컨트롤이 자동으로 에 대한 호출을 수행하기 때문입니다.
  4. 다른 페이지에 컨트롤을 추가 한 경우 응용 프로그램의 홈 페이지가 아닌 경우 DOMContentLoaded 이벤트를 처리하고 핸들러를 사용하여 WinJS.UI.processAll을 호출합니다.

함수 초기화() {

WinJS.UI.processAll(); 

}

document.addEventListener ("DOMContentLoaded") (FALSE 초기화);