Обновление многих документов Рафаэля - PullRequest
0 голосов
/ 23 июня 2011

У меня есть этот класс Javascript (сокращен до необходимых частей):

function DigitalChannel ($xmlDoc) {
    var self = this;
    // Parse definition from $xmlDoc

    self.firstRender = function (rootElem) {
        var html = "";  // Build HTML string to display object information
        rootElem.html (rootElem.html () + html);  // Make above HTML visible

        self.paper = Raphael ("digDot" + self.numIndex, 54, 38);
        self.svgImage = self.paper.circle (30, 20, 15).attr ({
            "stroke-width": "2",
            "stroke": "#000000",
            "fill": "#00FF00"
        });
    }

    self.updateStatus = function (newState) {
        self.state = newState;
        if (self.state !== self.normalState) {
            self.svgImage.attr ("fill", "#FF0000");
        }
        else {
            self.svgImage.attr ("fill", "#00FF00");
        }
    }
}

Теперь, пожалуйста, предположим, что все переменные, используемые в моих методах, были правильно инициализированы из данных XML (я убедился, что это так в Firebug). Цифровой канал может иметь значение 0 или 1 и нормальное значение 0 или 1. Если текущее значение соответствует нормальному значению, я хочу, чтобы нарисованный круг был зеленым, в противном случае - красным. Тогда у меня есть этот класс:

function PageManager () {
    var self = this;
    self.base_url = "http://" + location.hostname + "...";
    self.digital_channels = new Array ();

    var fullPath = self.base_url + "...";
    $.ajax (fullPath,
            {
                type: "post",
                cache: true,
                context: self,
                success: function (data) {
                    $xmlDoc = $($.parseXML (data));
                    $xmlDoc.find ("channel").each (function () {
                        self.digital_channels.push (new DigitalChannel ($(this)));
                    });
                }
            });

    self.firstRender = function () {
          for (i in self.digital_channels) {
              self.digital_channels[i].firstRender ($("#rootElem"));
          }
    }

    self.updateDigitals = function () {
        var fullPath = self.base_url + "...";
        $.ajax (fullPath,
                {
                    type: "post",
                    cache: true,
                    context: self,
                    success = function (data) {
                        var digital_idx = 0;
                        var mask = 0x0001;
                        $xmlDoc = $($.parseXML (data));
                        $xmlDoc.find ("digital_inputs").each (function () {
                            var bits = parseInt ($.trim ($(this).text ()));
                            for (i = 0; i < 32; i++) {
                                self.digital_channels[digital_idx].updateState (bits & mask);
                                bits = bits >>> 1;
                                digital_idx += 1;
                            }
                        });
                    }
                });
    }
}

Итак, на данный момент я определил все, что мне нужно, и затем я делаю это:

var pageManager = new PageManager ();
pageManager.firstRender ();
pageManager.updateDigitals ();

Опять же, предположим, что все происходит в правильном порядке. Фактические классы являются более сложными, и ничто не будет вызвано раньше времени. Я использовал Firebug для пошагового прохождения всего, и сейчас у меня есть страница из 64 зеленых точек после pageManager.firstRender ();, что я и хочу. Когда я звоню pageManager.updateDigitals ();, я должен видеть, что первые 32 точки остаются зелеными, а следующие 32 точки становятся красными. Я видел, как внутри кода все идет хорошо, даже до того момента, когда DigitalChannel.updateState (newState); фактически меняет цвет круга svgImage; однако только самая последняя точка визуально меняет цвет. Я прошу прощения за такой длинный вопрос, но кто-нибудь знает, почему?

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Оказалось, что это была проблема времени. Создание HTML-кода, в котором содержалась бы бумага Рафаэля, а затем немедленное создание бумаги, привело к тому, что что-то испортилось, поэтому я добавил задержку в создании документов, и теперь все работает как ожидалось.

0 голосов
/ 23 июня 2011

Может быть потому, что self.normalState не определено в DigitalChannel?

...