Comportamentos de anexação do Drupal: reagir a todo o conteúdo recém-carregado?

12

Eu tenho dois módulos diferentes que, de várias maneiras, trabalham juntos. Uma das coisas em que trabalham juntos é que o módulo A carrega conteúdo via AJAX, e o módulo B precisa anexar ouvintes de eventos ao conteúdo carregado.

No entanto, parece que quando o conteúdo é carregado via AJAX pelo módulo A, apenas a função 'attach' de Drupal.behaviours.a é invocada, e não a função 'attach' de Drupal.behaviours.b . Ambas as funções são invocadas no carregamento da página, mas não no carregamento subsequente do conteúdo AJAX.

// This runs every time module A loads new content.
Drupal.behaviors.a = {
  attach: function(context, settings) {
    alert('a:attach');
  }
}

// This only runs on page load, but never when module A loads new content.
Drupal.behaviors.b = {
  attach: function(context, settings) {
    alert('b:attach');
  }
}    

Como faço para executar a função 'anexar' do Drupal.behaviours.b toda vez que um módulo carrega novo conteúdo?

sbrattla
fonte
Você já tentou adicionar Drupal.attachBehaviors();ao retorno de chamada de sucesso do ajax?
Clive
Não, mas isso não deve ser resolvido automaticamente? Eu pensei que essa era toda a idéia da função 'anexar'; que deve ser chamado no carregamento da página e atualização da página? Parece, no entanto, que apenas a função 'anexar' para o módulo de chamada é chamada na atualização da página?
precisa saber é o seguinte
Essa foi a minha compreensão, sim, eu nunca pensei muito nisso. Sei que houve momentos em que após uma chamada de AJAX Eu precisava comportamentos Recoloque então eu assumi que era necessário
Clive
Examinando drupal.js: "Drupal.attachBehaviors é adicionado abaixo ao evento pronto para jQuery e, portanto, é executado no carregamento inicial da página. Os desenvolvedores que implementam AHAH / Ajax em suas soluções também devem chamar essa função após o carregamento do novo conteúdo da página, alimentando um elemento a ser processado, para anexar todos os comportamentos ao novo conteúdo ". Parece que eu preciso invocar os comportamentos de anexo. Mas; me intriga que a função 'attach' do módulo A seja executada mesmo que eu não tenha chamado o attachBehaviours no retorno de chamada de sucesso do AJAX ...? Por que apenas para o módulo de chamada, e nem todos os módulos?
precisa saber é o seguinte
1
Se você quer um catch-all solução $('body').ajaxSuccess(Drupal.attachBehaviors);provavelmente irá funcionar
Clive

Respostas:

4

Isso, a partir dos comentários misc/drupal.js, explica como deve funcionar:

  • Drupal.attachBehaviors é adicionado abaixo ao evento pronto para jQuery e, portanto,
  • é executado no carregamento inicial da página. Desenvolvedores que implementam AHAH / Ajax em seus
  • As soluções também devem chamar essa função após o conteúdo da nova página.
  • carregado, alimentando um elemento a ser processado, para anexar todos
  • comportamentos para o novo conteúdo.
lazysoundsystem
fonte
2

Tente adicionar isso no Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Nanak
fonte