2013-11-27 3 views
4

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

var myComponent = Ractive.extend(
    { 
     uselessFunction: function() 
     { 
      alert('Hello ' + this.data.who); 
     } 
    } 
); 

var myRactive = new Ractive(
    { 
     el: 'body', 
     components: 
     { 
      mycomponent: myComponent 
     }, 
     template: '{{#people}}<rv-mycomponent who="{{.}}"/>{{/people}}', 
     data: 
     { 
      people: 
      [ 
       'Mike', 
       'Charly', 
       'April' 
      ] 
     } 
    } 
); 

Запуск этого я получу 3 экземпляра myComponent. Теперь то, что я хотел бы иметь, было бы каким-то образом назвать бесполезную функцию на любом экземпляре компонента из метода myRactive (или даже лучше для всех экземпляров).

Существует, конечно, множество возможных обходных путей (например, использование наблюдателей в компонентах, а затем изменение некоторых общих свойств), но я надеялся на какой-то встроенный интерфейс. Увы, насколько я просеиваю через myRactive Object, я не могу найти ссылку на экземпляры компонентов. Хотя я подозреваю, что это один из них, так как mySomponent (teardown) также вызывает teardown() для каждого компонента.

ответ

2

Обновление: этот ответ очень старый. Правильный способ доступа детей компонентов является с ractive.findComponent(name) или ractive.findAllComponents(name)


Существует не хороший способ сделать это, но это возможно:

people = []; 

Ractive.components.person = Ractive.extend({ 
    init: function() { 
    people.push(this); 
    }, 
    uselessFunction: function() { 
    alert('Hello ' + this.get('who')); 
    } 
}; 

ractive = new Ractive({ 
    el: 'body', 
    template: '{{#people}}<person who="{{.}}"/>{{/people}}', 
    data: { people: [ 'Mike', 'Charly', 'April' ] } 
}; 

// later... 
people[0].uselessFunction(); // alerts 'Hello Mike' 

(пь этот код выиграл он работает с текущим выпуском, он предполагает, что вы находитесь на 0.3.8, который канавы rv- и позволяет вам регистрировать компоненты по всему миру на Ractive.components.)

Как я уже сказал, это довольно неэлегантно. Попытались выяснить, как лучше всего это решить. Один из подходов, который я исследую, - это разрешить ractive.find() и ractive.findAll() - которые аналогичны ractive.el.querySelector()/ractive.el.querySelectorAll() - для поиска компонентов (например, ractive.findAll('people')), а также узлов DOM. Я открыт для любых предложений в то же время!

+0

Глобальное пространство имен не является вариантом, поскольку я работаю с установкой AMD. Но на данный момент я использую довольно схожую обходную процедуру, где передаю объект до тех компонентов, которые вводят инстанции. Найти обходные пути - это не моя проблема, хотя;). Невозможно ли просто иметь свойство в активном объекте (например, «подкомпоненты» или что-то еще), которое содержит ссылки на экземпляры компонента? – skeptic35

+0

Я вижу, что экземпляр компонента содержит ссылку на «parent» в .component.parentFragment.root, поэтому теоретически я мог бы использовать это, чтобы вставить ссылку на мой компонент в родительский. Увы,.свойство компонента еще не доступно, когда вызываются какие-либо из функций обратного вызова (beforeInit, complete, init). – skeptic35

+0

Кажется, что каждый компонент должен знать о своих детях. Я не могу придумать один фреймворк, который я использовал, который * не *, по крайней мере, не на рабочем столе. – Joel

0

Вот аналогичное решение я использую:

Ractive.defaults.isolated=true; 
componentsHash = {}; // GLOBAL 
Ractive.defaults.oninit=function(){ 
    if (this.get('ref')) 
     componentsHash[this.get('ref')]=this; 
}; 
Ractive.defaults.onteardown=function(){ 
    if (this.get('ref') && componentsHash[this.get('ref')]) 
     delete(componentsHash[this.get('ref')]); 
}; 

Объект "componentsHash" содержит ссылки на все созданные компоненты.

Использование:

<some-component ref="Mike1"/> 
<some-component ref="Mike2"/> 

Затем вы можете найти экземпляр компонента Mike1 с помощью:

componentsHash['Mike1'] 
Смежные вопросы