2012-10-11 5 views
0

자주 GAS 사용자 (me too)는 ServerHandler.addCallbackElement 방법을 사용하지 않거나 모든 제어를 포함하지 않는 방식으로 사용하십시오.ServerHandler.addCallbackElement 메소드를 가지고있는 배경은 무엇입니까?

이 방법을 사용하는 배경 정보는 무엇입니까? 왜 GAS 개발자들이 그것을 도입 했습니까? 모든 입력 위젯 값을 모든 서버 핸들러에 매개 변수로 전달하는 것이 더 간단합니까?

documentation은 이러한 질문에 대한 답을 제공하지 않습니다. 콜백 소자 제어 상이한 세트를 처리 할 핸들러의 여러 경우 GAS 브라우저와 서버 사이의 트래픽을 감소시키기 때문에

난 다음 원인

  1. 추가 위젯 참조. 여기에 질문이 있습니다. 얼마나 많은 트래픽을 절약 할 수 있습니까? 나는 최대 몇 킬로 바이트, 보통 수백 바이트라고 생각한다. 현대 인터넷 연결 속도, 심지어 모바일 연결을 고려하면 가치가 있습니까?
  2. 폼에는 여러 단추가있는 표와 유사한 편집 컨트롤이 포함되어 있으며 같은 이름의 행 요소를 처리하는 것이 편리합니다. 이 문제는 tags을 사용하면 쉽게 피할 수 있습니다. 다음 예제를 참조하십시오. 태그가 다른 용도로 사용되는 경우 소스 버튼 ID를 구문 분석하고 행 번호를 추출하는 데 문제가되지 않습니다.
  3. 무대 뒤에서 사용되는 기술의 한계. 그러한 한계가 있다면, 그것들은 무엇입니까?
function doGet(e) { 
    var app = UiApp.createApplication(); 
    var vPanel = app.createVerticalPanel(); 
    var handler = app.createServerHandler("onBtnClick"); 
    var lstWidgets = []; 
    for (var i = 0; i < 10; i++) { 
    var hPanel = app.createHorizontalPanel().setTag('id_' + i); 
    var text = app.createTextBox().setName("text_" + i); 
    text.setText(new Date().valueOf()); 
    var btn = app.createButton("click me").addClickHandler(handler); 
    btn.setTag(i).setId('id_btn' + i); 
    var lbl = app.createLabel().setId("lbl_" + i); 
    hPanel.add(text); 
    hPanel.add(btn); 
    hPanel.add(lbl); 
    lstWidgets.push(text); 
    lstWidgets.push(btn); 
    vPanel.add(hPanel); 
    } 
    // The addCallbackElement calls simulate situation when all widgets values are passed to a single server handler. 
    for (var j = 0; j < lstWidgets.length; j++) { 
    handler.addCallbackElement(lstWidgets[j]); 
    } 
    app.add(vPanel); 
    return app; 
} 

function onBtnClick(e) { 
    var app = UiApp.getActiveApplication(); 
    var i = e.parameter[e.parameter.source + '_tag']; 
    var lbl = app.getElementById("lbl_" + i); 
    lbl.setText("Source ButtonID: " + e.parameter.source + ', Text: ' + e.parameter["text_" + i]); 
    return app; 
} 

답변

3

큰 질문.

"트래픽이 얼마나 저장됩니까?" 나는 우리가 아직 알지 못한다고 생각하지만, 시간이 지남에 따라 더 효율적으로 될 것으로 기대합니다. Here is another discussion on performance. 구글의 방대한 테스트와 개선 만이 모범 사례를 식별 할 수있게 해줄 것입니다. 가능한 한 언제든지 ClientHandlers가 분명히 ServerHandlers보다 낫다고 말할 수 있습니다.

자바 스크립트 개발자로서 저는 클라이언트 쪽에서 주로 사용한다고 생각합니다. 그런 다음 PHP/ASP를 서버 측 도구로 생각합니다. 지금까지 나의 GAS 코드는 실제로 클라이언트와 서버 측 (적어도 서버 측 기능을 호출 할 때)을 실행하지만, 클라이언트 쪽에서는 서버 측에서 더 많은 일이 진행되고있는 것 같다. 이것은 다소 "컴파일 된"코드를 생성하는 것으로 보인다. 필자는 자바 경험에서이 다중 계층 배포를 인식하고 있습니다.

동일한 작업을 수행하는 방법이 많기 때문에 Google에서는 코드를 직접 작성하지 않으면 코드를 직접 해석하지 않아도됩니다. 코드를 손으로. 이것이 내가 다른 솔루션보다 더 효율적으로 될 것이라고 생각하는 이유입니다. 지금은 당신이 성능에 대해 걱정한다면 GAS를 벗어나도록 제안 할 것입니다. 어쩌면 재미만으로도 런타임시 클라이언트 측 웹 앱 소스를 볼 수 있습니다 (소스보기). 그래서 그들이 가장 효율적으로 일을 처리하기 위해서, 우리가 매우 높은 수준의 방식으로 사물을 정의하게함으로써 이익을 얻을 것이라고 상상합니다. 이렇게하면 코드를 해석 할 때 유연성이 극대화됩니다.

두 번째 질문에 구체적으로 답하기 위해 개인적으로 참조하는 태그 (및 대부분의 doGet)가 클라이언트의 브라우저 엔진에있는 반면 서버 측에서 실행중인 Handler Function onBtnClick()을 개인적으로 생각합니다. -측면. 특정 이벤트/요청을 처리하는 데 필요한 메모리 양에 대해 미리 생각해 보면 서버 측에서 기능이 훨씬 더 유연하고 효율적이며 강력하다는 것을 알 수 있습니다. (각 getElementById() 호출이 매번 새로운 미니 웹 페이지에 대한 링크를 클릭하는 것과 같이 별도의 요청을 실행하는 경우 분명합니다.)

그래서 이제는 처리기가 자동으로 매개 변수를 만들 수없는 이유가 여기 있습니다. 내 처리기 함수에서 사용하는 물건 만 있으면 되나요? 첫 번째로이 질문을하는 유일한 이유는 UiApp에 양 끝에서 사용할 수있는 일부 항목이 있기 때문입니다. 아니므로이 값은 넣어 명시 적으로 ScriptProperties.setProperty() 또는

  • 같은 저장 중

    • 해야 할 UiApp가의 doGet과의 onclick 만의 doGet에 정의 된 변수 모두의 범위에 이미 UiApp 곳 addCallbackElement를 사용하여 처리기 기능()에 주어진 ID 또는 명시 적으로

    가 내 app.create ... 생성자로 생성되지 않았기 때문에 당신이 addCallbackElement (lstWidget)에 있었다 방법 공지 사항 UiApp 객체 내 생각 엔 GAS가 Google 측에서 웹 서비스에 XML을 준수하는 SOAP 호출을 구현하고 있기 때문에 실제로 클라이언트 측 소스 코드를 연구하여이를 파악할 수 있습니다. 다시 말해 우리는 setProperty()를 사용해도 상관 없습니다. 심지어 JDBC를 통해 저장 한 다음 처리기 함수 내에서 다른 연결을 사용하여 데이터를 검색 할 수도 있지만 데이터가 클라이언트에서 서버로 또는 그 반대로 전달되어야합니다. -versa.

    프로그래밍 측면에서 클라이언트 측 doGet 함수의 범위에서 사용할 수있는 많은 것들이 있습니다. 서버에서 전달하지 않으려하거나 서버 측 범위 내에 함수가있을 수 있습니다. doClick()은 클라이언트 측에서 함수와 같은 이름으로 호출되지만 사실 완전히 다른 하드웨어에서도 호출 할 수 있습니다 (개발자의 관점에서 보면 동일한 방식으로 작동하지만).

    아마도 Google 팀은 UiApp이 실제로 어떻게 작동하는지 아직 결정하지 않았을 것입니다. 그렇지 않으면 그들은 단지 우리가 모든 것을 거기에 넣을 수있게하거나 강제 할 것입니다. UiApp.getActiveApplication()이라는 이름을 기반으로 UiApp.getActiveApplication()을 호출하면 UiApp 객체에서 전용 인스턴스를 반환하는 메서드가 아니라 생성자와 같은 것으로 간주됩니다. (객체는 이전에 인스턴스화되어 어딘가에 초기화 된 클래스입니다.) 100 % 질문에 답을 얻지는 못했지만 확실히 시도 했으므로 커뮤니티의 더 깊은 통찰력은 분명히 인정 될 것입니다.

    이제는 주제를 벗어날 수는 있지만 장기적으로 성능을 개선하기 위해 실제 제품이 계속 변경 될 것이라고 상상해보십시오. 그래도 우리는 클라이언트 측 코드를 그러면 개발자는 Google의 성공입니다. 지금 내가 잘못한 것을 말하면 나에게 맞춰주세요. 나는 최근에이 도구들을 사용하기 시작했고 더 많은 것을 배울 때 더 많은 특성들로이 질문을 후속 계획을 세우고 있습니다. 그러나 지금 당장은 저의 가장 좋은 해석입니다.

  • 0

    모든 하위 요소는 당신의 doPost 함수로 전송됩니다은 FormPanel를 사용하는 경우. 버튼을 소스로 사용합니다. 그러면 UIapp가 정리됩니다.

    콜백을 사용하지 않으려는 경우 어떤 요소와 형제를 보낼지 지정해야합니다.

    이것은 UIapp가 디자인 된 방식입니다.

    +1

    질문은 UIapp가 이러한 방식으로 설계된 이유였습니다. (내가 이해 한대로) –

    +0

    아마도 uiapp는 요소 자체가 아니기 때문일 수 있습니다. 따라서 요소의 이름을 지정해야합니다. 모든 HTML 물마루를 페이지의 버튼에 보내면 동일합니다. 하지만 첫 번째 태그에 충돌이 있습니다. – Thomas

    +1

    @Sergeinsas는 완전합니다.나는 왜 UIapp가 이런 식으로 설계되었는지 궁금하다. – megabyte1024

    관련 문제