Как запустить уведомление наблюдателя, и чтобы слушатель находился в другом окне XUL - PullRequest
2 голосов
/ 20 июля 2011

Я новичок в программировании на XUL, и я многому научился, но мне трудно разобраться в том, как запустить уведомление наблюдателя, и у меня есть слушатель в другом окне XUL, чтобы получить строковое значение из функции наблюдателя ( наблюдатель передает строковый параметр в другое окно XUL).

Это мой файл xil.

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window title="ContactMatrix;"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <script type="application/x-javascript" src="fire.js" />

    <hbox>
<textbox type="search" oncommand="SearchKeyword(this)"/>
    </hbox>

<tree editable="false" id="my-tree" flex="1"   seltype="cell" onclick="onTreeClicked(event)"
datasources="file://C:/mercredi.xml" ref="*" querytype="xml" enableColumnDrag="true" hidecolumnpicker="false"  >
</tree>
</window>

Это мой сценарий:

function SearchKeyword(oElem)
{
  var filter = document.getElementById("filter");
  filter.setAttribute("value", oElem.value);
  document.getElementById("my-tree").builder.rebuild();
}


function onTreeClicked(event){
  var tree = document.getElementById("my-tree");
  var tbo = tree.treeBoxObject;

  // get the row, col and child element at the point
  var row = { }, col = { }, child = { };
  tbo.getCellAt(event.clientX, event.clientY, row, col, child);

  var cellText = tree.view.getCellText(row.value, col.value);
  alert(cellText);
observe();
}

XPCOMUtils.defineLazyServiceGetter(this, "obsService", "@mozilla.org/observer-service;1", "nsIObserverService");
  obsService.notifyObservers(null, "xulschoolhello-test-topic", cellText);
let observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.addObserver(testObserver, "xulschoolhello-test-topic", false);

let testObserver = {
  observe : function(aSubject, aTopic, cellText) {
    if (aTopic == "xulschoolhello-test-topic") {
      window.alert("Data received: " + cellText); //cellText=aData
      var textboxElement = document.getElementByID("ali");
textboxElement.value = cellText; // from the notification
    }
  }
}

var yourAddonObject = {
   obsService:     Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),

   register: function()
   {

                this.obsService.addObserver(this, "xulschoolhello-test-topic", false);
   }
}

function DisplayContacts()
{
    alert('opening file fire');
var windowObjectReference = window.openDialog("chrome://hello/content/fire.xul","fire");
}

Это мой текстовый файл XUL. Где я хочу запустить значения ячеек дерева xul в текстовое поле в этом файле.

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<window title="Subjects import"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >

    <script type="application/x-javascript" src="fire.js" />

<groupbox>
<caption>Subject(s)</caption>
    <hbox>
    <label  value="Subjects"/>
     <textbox id='ali' value=""/>
     <button label="Contacts" onclick="DisplayContacts();"/>
    </hbox>
</groupbox>
</window>

У меня проблема с запуском значений ячеек дерева в другое окно XUL. Из моего XUL-файла с текстовым полем я могу открыть свой XUL-файл дерева, и когда я нажимаю на ячейку дерева, я могу получить значения этой ячейки дерева в виде предупреждающего сообщения. После этого мой скрипт не работает.

По сути, здесь, когда я нажимаю на ячейку дерева, выбранные значения ячейки дерева должны открываться в моем текстовом поле в другом окне XUl.

Кто-нибудь, пожалуйста, помогите мне решить эту проблему. Здесь я разделил файл сценария и файлы XUL. С этого сайта я взял все возможные сценарии. https://developer.mozilla.org/en/XUL_School/Observer_Notifications Спасибо. Примечание: я обновил свой вопрос в том же посте здесь.

1 Ответ

1 голос
/ 21 июля 2011

В своем опубликованном коде вы определяете testObserver после добавления наблюдателя, что означает, что наблюдатель будет вызывать не вашу функцию наблюдения, а функцию наблюдения неопределенной функции ... Вы должны либо определить его перед добавлением наблюдателя, либо определить функцию наблюдения с помощью testObserver.observe = function () {}

Но для более простого использования обозревателя я бы использовал этот файл:
http://code.google.com/p/songbird-telescope/source/browse/trunk/modules/Observers.js?r=2
Это оболочка nsIObserver.
Вам просто нужно импортировать файл, в котором есть модуль, в который вы хотите отправить и наблюдать уведомление:

 Components.utils.import('resource://modules/Observers.js');

Вы можете наблюдать уведомление, используя:

Observers.add('myTopic', myCallback, myCallbackSubject);

Затем, каждый раз, когда выполняется следующая строка, вызывается myCallback с параметромForMyCallback в качестве параметра:

Observers.notify('myTopic',parameterForMyCallback);
...