Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [jQuery/JS/OOP] Dziedziczenie - problem i pytanie
starach
post
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


Chcąc stworzyć sobie Log wywołań AJAXa postanowiłem rozszerzyć klasę Pane:
Kod
function Pane()
{
    this.id = 0;
    this.id_html = '';
    this.name = '';
    this.jquery = '';
    this.content = '';
    this.template = '';
    this.container = $('body');
    this.isMinimized = false;
    var ths = this;
    this.open = function()
    {
        this.register();
        this.setTemplate();
        this.container.append(this.template);
        this.jquery = $('div#'+this.id_html);
        this.registerEvents();
    }
    this.close = function()
    {
        this.jquery.remove();
        PaneManager.unregister(this.id);
    }
    this.minimize = function()
    {
        $('div.content', this.jquery).css('display', 'none');
        this.isMinimized = true;
    }
    this.maximize = function()
    {
        $('div.content', this.jquery).css('display', 'block');
        this.isMinimized = false;
    }
    this.register = function()
    {
        this.id = PaneManager.register(this);
    }
    this.registerEvents = function()
    {
        $('div.btn_c', this.jquery).click(function(){ ths.close() });
        $('div.btn_m', this.jquery).click(function(){ if(ths.isMinimized) { ths.maximize(); } else { ths.minimize(); } });
        this.jquery.bind('dragstart',function(event)
        {
            return $(event.target).is('.header');
    });
    this.jquery.bind('drag', function(event)
        {
            $(this).css({ top: event.offsetY,left: event.offsetX });
        });
    }
    this.setTemplate = function()
    {
        this.id_html = 'pane-' + this.id;
        this.template = '<div id="' + this.id_html + '" class="pane">\n\
                                         <div class="header">' + this.name + '\n\
                                             <div class="btn_m">-</div>\n\
                                             <div class="btn_c">x</div>\n\
                                         </div>\n\
                                         <div class="content">' + this.content + '</div>\n\
                                         </div>';
    }
}

Klasą PaneLog:
Kod
function PaneLog()
{
    this.content = '<ul></ul>';

    this.append = function($message)
    {
        $('ul', this.jquery).append('<li>'+$message+'</li>');
    }
    this.setName = function($name)
    {
        this.name = '[LOG] ' + $name;
    }
    this.close = function()
    {
        alert('test')
        this.jquery.remove();
        PaneManager.unregister(this.id);
    }
    this.test = function()
    {
        console.log(this);
        console.log(this.id_html);
    }
}
PaneLog.prototype = new Pane();


Problem pierwszy: Metoda close klasy PaneLog jest nadpisywana przez metodę klasę rodzica. Jak temu zaradzić?
Problem drugi: Przy wywołaniu metody close zgłaszany jest błąd "this.jquery.remove is not a function". Przy wywołaniu innych metod korzystających z tej zmiennej komunikat się nie pokazuje. Może to być jednak uwarunkowane tym że this.jquery jest potrzebne jedynie jako kontener w którym wyszukany ma zostać pewien element i jako że jest on pusty wyszukanie odbywa się na całym dokumencie. Jest to tylko moje przypuszczenie bo nie wiem jak mogę to sprawdzić.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
smentek
post
Post #2





Grupa: Zarejestrowani
Postów: 130
Pomógł: 11
Dołączył: 7.04.2003

Ostrzeżenie: (10%)
X----


1. W javascript nie ma czegos takiego jak klasa. To co w swoim programie nazywasz klasą, jest funkcją (która jest także obiektem). A co do zasłoniętej metody, proponuje przerobic kod na taką modłę:

  1. <?php
  2. var Pane = function(){ // <---Przy tym zapisie widac wyraznie, ze Pane to nie zadna klasa a obiekt :)
  3.    this.costam = 'xxx';
  4.    this.ooo = 'ababa';
  5.    this.close = function(){
  6.        alert('zamykam' + this.costam)
  7.    }
  8.    
  9.    
  10. };
  11.  
  12. var PaneLog = function(){
  13.    //Po odkomentowniu zmienna o wartości yyy 'wyjdzie na wierzch'
  14.    //this.costam = 'yyy';
  15.    this.close = function(){
  16.        alert('closing' + this.costam)
  17.  
  18.    }
  19. }
  20.  
  21.  
  22. var myPane = new Pane();
  23. myPane.close();
  24.  
  25. //wskaźnik this z obiektu PaneLog będzie od tego momentu wskazywac na obiekt Pane
  26. PaneLog.prototype = new Pane();
  27.  
  28. var myPaneLog = new PaneLog();
  29. myPaneLog.close();
  30. ?>


2. Co do drugiego błędu, zgaduje że w danym momencie pod zmienną this.jquery nie ma wartości która odnosiła by sie do obiektu
jQuery. Tak jak w przykładzie poniżej. W wiekszości przypadków używasz this.jquery do budowy selectora tak więc nigdy nie wygeneruje to błędów (co najwyżej elementy drzewa DOM nie zostaną znalezione).

  1. <?php
  2. $(document).ready(function(){
  3.    var smiec = 'bzdury';          // <-- łancuch znaków
  4.    var element = $('#usmiech2'); // <-- obiekt jQuery
  5.    
  6.    element.remove();
  7.    smiec.remove();
  8. });
  9. ?>


Fakt że this.jquery jest zmienną obiektu wydaje mi się złym rozwiązaniem. Obiekt powinien zawierać to co jest jego częścią składową this.jquery jest tu 'ciałem obcym' (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Musisz myśleć bardziej globalnie.
Programuj swoje obiekty tak jak by cała warstwa wizualna wogóle nie istniała zajmuj się nią na samym końcu. Np metoda do usunięcia czegos:

  1. <?php
  2. ... //jestsmy w obiekcie    
  3.    this.id; //Parametr id identyfikuje nam obiekt.
  4.    this.close = function(){
  5.        //Tutaj kod który usunie element + jakieś inne działania na innych obiektach z tym zwiazane
  6.  
  7.            ....
  8.  
  9.        //Wyrzucamy nasz element z drzewa DOM (przestaje byc widoczny)
  10.        $('#' + this.id).remove();
  11.  
  12. ... //i dalej nastepne metody obiektu
  13.    }
  14. ?>


Parametr this.id to praktycznie wszystko co jest potrzebne aby odnaleźć interesujący nas węzeł drzewa DOM i zmienić wygląd strony. Mając go możemy użyc jQuery czy innej biblioteki. aby zmienić ten fragment strony, który przedstawia nasz obiekt (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 00:37