2013-11-28 3 views
3

Создатель создает свои Ребенки. Каков наилучший способ вызова ClickedOnMyChild Creator, если нажать кнопку «Child»?Вызов родительского объекта Функция объекта

function Creator() 
{ 
    var c1 = new Child("Albert"); 
    var c2 = new Child("Sarah"); 

    var ClickedOnMyChild = function() 
    { 
     //alert name of child 
    } 
} 

function Child(name) 
{ 
    this.name = name; 

    function ClickHandler() 
    { 
     // a click on me, better call my Creator 
    } 
} 

Мои мысли до сих пор:

  1. статический Создатель (нет, мне нужны примеры)
  2. Trigger пользовательского события в ребенка (мой любимый до сих пор)
  3. Pass родительского экземпляра к ребенку (не является хорошей практикой)
+2

Там нет "лучшего" способа, это зависит от ваших требований. Самым простым было бы просто 'c1.click = function() {...}', а затем вы просто нажимаете 'click' на ребенка, когда вам нужно. – Jon

+5

Что плохого в опции 3? (Особенно, когда вы знаете, что дети должны иметь возможность сказать родителям что-то.) – nnnnnn

+0

Если вы хотите, чтобы 'c1' и' c2' придерживались объекта 'Creator', они должны быть определены как' this.c1 ... 'и' this.c2 ... ' –

ответ

2

Я бы пошел на второе: Trigger Custom Event в Child. Поскольку это не только позволяет вам обрабатывать событие в вашем родителе, но также и any objects, заинтересованные в событии.

Ниже приведен пример код:

function Event(sender) { 
     this._sender = sender; 
     this._listeners = []; 
    } 

    Event.prototype = { 
     attach: function (listener) { 
      this._listeners.push(listener); 
     }, 
     notify: function (args) { 
      for (var i = 0; i < this._listeners.length; i++) { 
       this._listeners[i](this._sender, args); 
      } 
     } 
    }; 

function Creator() 
{ 
    var c1 = new Child("Albert"); 
    var c2 = new Child("Sarah"); 

    c1.click.attach(function (sender,args){ 
     //alert name of child 
     alert(args); 
    }); 

    c2.click.attach(function (sender,args){ 
     //alert name of child 
     alert(args); 
    }); 
} 

function Child(name) 
{ 
    this.name = name; 
    this.click = new Event(this); 

    var _this = this; 
    function ClickHandler() 
    { 
     _this.click.notify(_this.name); 
    } 
} 

Ссылка ссылка: http://alexatnet.com/articles/model-view-controller-mvc-javascript

+0

Действительно приятно. С примером кода. Я собираюсь использовать его для иностранных классов. – bergman

2

Номер опции 3. is indeed a good practice. Если бы вы когда-нибудь запрограммировали что-то, где вам нужно сохранить иерархию, вы бы поняли, насколько это здорово. Вы можете изменить свой класс ребенка к этому и явным образом установить создателю в Creator классе по телефону setCreator метод:

function Child(name) 
{ 
    this.name = name; 
    this.creator = null ; 

    this.setCreator = function(creator){ 
    this.creator = creator ; 
    } 

    this.clickHandler = function() 
    { 
     if (this.creator) 
     this.creator.clickedOnMyChild(); 
    } 
} 

Примечания:

  • Имена функций должны начинаться с маленькой буквы
  • Открытые свойства и методы должно быть присвоено ключевому слову this. В противном случае вы не сможете использовать их вне класса.
+0

Возможно, они не должны были публично? – Bergi

+0

Может быть, это не так, но я действительно считаю, что обработчики событий должны быть общедоступными. – vikingmaster

+0

Я всегда думал, что прохождение родителей - плохая практика. Я должен ухаживать за ним. – bergman

Смежные вопросы