0

LiveView가 다시 컴파일하려고 할 때이 오류가 계속 발생합니다. LiveView의 작동 방식에 대해 누구나 알 수 있습니까? "Alloy.Globals.layout.activityList"객체가 존재하지만, LiveView는 Alloy Globals가 존재하지 않는 코드의 일부만을 다시 컴파일합니까?Appcelerator Studio LiveView 재 컴파일 오류

[ERROR] : Script Error { 
[INFO] : { 
[ERROR] :  column = 36; 
[ERROR] :  line = 28; 
[ERROR] :  message = "undefined is not an object (evaluating 'Alloy.Globals.layout.activityList')"; 

Appcelerator의 "Movies"예제 응용 프로그램은 Alloy.js의 레이아웃 객체를 갖는 것과 동일한 논리를 사용합니다. 정확히 똑같은 일을하고있는 Im, 그러나 그 엉망진창 upp는 10 번 중 8 번 정도를 다시 컴파일합니다.

/** 
* Calculate element dimensions for given screen size 
* @param {Object} size containing width and height properties 
*/ 
Alloy.Globals.calculateElementDimensions = function(size) { 

    var layout = {}; 

    layout.device = {}; 
    layout.device.width = size.width; 
    layout.device.height = size.height; 

    // lists 
    layout.activityList = {}; 
    layout.activityList.cell = {}; 

    layout.activityList.cell.width = size.width; 
    layout.activityList.cell.height = 60; 
    layout.activityList.cell.spacing = 1; 

    layout.activityList.cell.dateView = {}; 
    layout.activityList.cell.dateView.width = layout.activityList.cell.height; 
    layout.activityList.cell.dateView.height = layout.activityList.cell.height; 

    layout.activityList.cell.detailsView = {}; 
    layout.activityList.cell.detailsView.width = (layout.activityList.cell.width - layout.activityList.cell.dateView.width) - 50; 
    layout.activityList.cell.detailsView.height = layout.activityList.cell.height; 

    layout.activityList.cell.deleteView = {}; 
    layout.activityList.cell.deleteView.width = size.width * 0.2; 
    layout.activityList.cell.deleteView.right = (0 - layout.activityList.cell.deleteView.width); 
    return layout; 
}; 

// Calculate element dimentsions 
Alloy.Globals.layout = Alloy.Globals.calculateElementDimensions(Alloy.Globals.Device); 
Alloy.Globals.getCalculatedWidth = function(_percentage){ 
    return (Alloy.Globals.Device.width * (_percentage/100)); 
}; 

#UPDATE

은 내가 오류를 유발 뭐죠 발견 한 것 같아요. 그것은 실제로 새로운 업데이트 된 코드를 실행하는 데 문제가 아니라 오히려 종료 및 새로 고침 전에 오류가있는 것 같습니다.

**[INFO] : [LiveView] Reloading App** 
[INFO] : Login win close 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : validateLogInInfo 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : UI SHUTDOWN COMPLETE. TRYING TO RESUME RESTART 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : RUNNING CODE IN ACTIVITIES.JS 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
**[ERROR] : Script Error { 
[ERROR] :  column = 36; 
[ERROR] :  line = 42; 
[ERROR] :  message = "undefined is not an object (evaluating 'Alloy.Globals.layout.device')"; 
[ERROR] :  stack = "Controller\ncreateController\nController\ncreateController\nvalidateLogInInfo\n"; 
[ERROR] : } 
Alloy.createController('login', { 
    callback: validateLogInInfo 
    }).getView().open();** 

오류는 window.close 이벤트 처리기에서 코드를 실행하고있는 것과 관련이있는 것처럼 보입니다. 하나의 컨트롤러에서 예를 들어 나는이 수행

Alloy.createController('login', { 
    callback: validateLogInInfo 
    }).getView().open(); 

을 그리고 login.js에서 내가 할 :

$.win.addEventListener('close', function(){ 
    log('Login win close'); 
    args.callback(); 
}); 

내가 콜백 후 라이브 뷰를 닫고 새로 시도 할 때 실행하려고하는 것 같아요, 따라서 컴파일러 오류. 성공적으로 다시로드 SO

[INFO] : [LiveView] Reloading App 
[INFO] : Login win close 
[INFO] : UI SHUTDOWN COMPLETE. TRYING TO RESUME RESTART 

에 windoew.close 이벤트 결과에 콜백을 제거, 완전히 다른 컨트롤러의 close 이벤트에 대한 콜백이 물건을 할 수있는 잘못된 방법을 제공하고있다?

+0

** calculateElementDimensions ** 메소드의 ** layout ** 변수에 ** activityList **의 키 - 값 쌍이 포함되어 있습니까? –

+0

이것은 미묘한 코드 오류이므로 원본 코드를 게시하십시오. 그러면 오류를 찾도록 도와 드리겠습니다. –

+0

그것은 않습니다, 그리고 가치가 정상적인 "실행"프로젝트를 할 때 응용 프로그램을 통해 작동하지 않습니다. alloy.js의 코드를 포함하고 Movies 예제 앱이 아닌 위 코드를 업데이트했습니다. –

답변

1

예, 코드가 올바르게 표시됩니다. LiveView 모드 및 추적 콘솔 모드에서 앱을 실행 한 다음이 문제를 일으키는 다른 것이 있는지 확인하십시오. enter image description here

추적 모드를 설정하려면 이미지를 참조하십시오.

+0

업데이트 된 질문에 감사드립니다. ** login.js ** 창에서 사용할 수없는 경우 ** args ** 변수를 사용하기 때문에 오류가 발생합니다. 따라서 올바른 방법은 이벤트 수신기에서 콜백 메서드를 호출하지 말고 창을 닫기 전에 호출하는 것입니다. 이제 창이 닫히는 것을 어떻게 알 수 있다고 생각하면 iOS와 Android에서 모두 뒤로 버튼에 onClick 이벤트를 작성하면됩니다. –

+0

네, 맞습니다. 더 이상 그것을 엉망으로 콜백에 새 컨트롤러를 열었습니다. 이제 args.callback()을 호출 한 다음 $ .win.close()를 호출하여 변경했습니다. –

+0

좋아요! 그것이 창을 닫기 전에 무엇인가를 수행하는 올바른 방법입니다. 보통 우리는 처음에는 닫을 때 onClose 이벤트가 시작될 것이라고 생각하지만, 요즘에는 거의 모든 응용 프로그램에서 윈도우를 닫기 전에 코드를 실행해야하므로 닫기 이벤트를 올바르게 오버 라이딩하는 것이 좋습니다. 행운을 빕니다 !!!! –