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?


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.

2

Tente adicionar isso no Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.