Существует ли для гаджета Google Wave определенная точка, в которой можно изменить пользовательский интерфейс?

Я бы хотел, чтобы у моего гаджета было два разных представления: одно, когда оно только что добавлено, чтобы пользователь мог ввести некоторую информацию, и, когда он закончит с этим, другое, которое отображает некоторые данные на основе этой информации.

Самый ранний момент, когда я могу решить, какое из этих двух представлений я должен отобразить, — это когда я получаю состояние в первый раз, то есть в обратном вызове состояния. Однако, когда я меняю пользовательский интерфейс, он не всегда отображается - очевидно, есть некоторые проблемы с синхронизацией. Иногда пользовательский интерфейс вообще не отображается, иногда он отображается нормально, иногда он появляется перед анимацией загрузки гаджета.

Вот простой тестовый пример:

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Trivial" height="120">
  <Require feature="wave" />
</ModulePrefs>
<Content type="html">
<![CDATA[
    <script type="text/javascript">
      function createForm () {
        document.write("<div id=\"form\">");
        document.write("Username: <input type=text value=\"whatever\" id=\"user_name\">");
        document.write("<input type=button value=\"Go!\" onClick=\"fetchFromUsername()\"><br>");
        document.write("NSID: <input type=text value=\"287312604@N00\" id=\"user_id\">");
        document.write("<input type=button value=\"Go!\" onClick=\"fetchFromNSID()\"><br>");
        document.write("Number of photos: <input type=text value=\"3\" id=\"per_page\">");
        document.write("</div>");
      }
    </script>
    <script type="text/javascript">
    function stateUpdated () {
      createForm ();
    }

    function init() {
      if (wave && wave.isInWaveContainer()) {
        wave.setStateCallback (stateUpdated);
      }
    }
    gadgets.util.registerOnLoadHandler(init);
    </script>
  ]]>
  </Content>
</Module>

person Mark Probst    schedule 20.10.2009    source источник
comment
Где второе представление в этом коде?   -  person Natim    schedule 27.10.2009
comment
Другого взгляда нет. С помощью этого кода я пытаюсь выполнить динамическое изменение пользовательского интерфейса после загрузки гаджета. Если я могу это сделать, я могу сделать так, чтобы появилось одно или другое представление. Но даже этот простой тест не работает надежно.   -  person Mark Probst    schedule 27.10.2009
comment
Я разработал для волны еще. Проблема может заключаться в document.write. Можете ли вы создать свои элементы с помощью document.createElement(element), а затем добавить их в свой контейнер? Это может решить ваши проблемы со временем.   -  person David Murdoch    schedule 28.10.2009


Ответы (1)


<script type="text/javascript">
  function createForm () {
    document.write("<div id=\"form\">");
    document.write("Username: <input type=text value=\"whatever\" id=\"user_name\">");
    document.write("<input type=button value=\"Go!\" onClick=\"fetchFromUsername()\"><br>");
    document.write("NSID: <input type=text value=\"287312604@N00\" id=\"user_id\">");
    document.write("<input type=button value=\"Go!\" onClick=\"fetchFromNSID()\"><br>");
    document.write("Number of photos: <input type=text value=\"3\" id=\"per_page\">");
    document.write("</div>");
  }
</script>

Как видно из http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268 документ,

write: Запись строки текста в поток документов, открытый функцией open(). Обратите внимание, что функция создаст документ, который не обязательно управляется DTD, и, следовательно, может привести к недопустимому результату в контексте документа.

Так что не круто использовать такой метод. Я рекомендую вам использовать фреймворк, такой как jQuery, который может создавать и добавлять элементы удобным для DOM способом. Это будет рабочий метод.

person Valentin Golev    schedule 29.10.2009