2012-01-05 21 views
17

Ben grails 1.3.7 uygulamada resources eklenti ilave yüklenen ve her şeyi eş zamansız olarak yüklendiğinde javascript dışında çalışıyor.Grails Kaynaklar Eklentisi ve AJAX JavaScript

Ben

<r:script> 
    // javascript here 
</r:script> 

içerir ve js kodu çalışmaması ajax ile yüklemek bir şablon var ve bu hatayı alıyorum Yani eğer:

It looks like you are missing some calls to the r:layoutResources tag

çünkü mantıklı sayfa zaten oluşturuldu ve yeni eklenen r: script js koduyla başa çıkmak için r: layoutResources yok.

buldum tek geçici çözüm uyumsuz içeriği oluşturmak kontrolör eylemlere fiili render(template:...) sonra render r.layoutResources(disposition:"defer")eklemektir.

Başka açık bir çözüm var mı?

cevap

18

Daha iyi bir yaklaşım AJAX yanıtları için özel bir düzen var olacaktır: Eğer Grails 2.0 kullanıyorsanız

<g:layoutBody/> 
<r:layoutResources disposition="defer"/> 

, oluşturulması yöntemi (render template: "...", layout: "ajax") içinde düzenini belirleyebilirsiniz. Aksi takdirde, düzeni sözleşmeye göre kullanın.

+0

Çok faydalı bilgiler! [Docs] 'da (http://grails.org/doc/latest/ref/Tags/render.html) böyle bir şey aramıştım, ancak render etiketinde 2.0'dan itibaren "layout" özelliği yok. 3. –

+0

+1 benim için de çok yararlı. –

+0

evet, bu çalışıyor – confile

4

Sanırım daha iyi bir seçenek, şablon parçanızda r: komut dosyasını kullanmamak. Sadece normal komut etiketini kullan. LayoutResources öğelerine ihtiyacınız yoksa, bu bölümlerin içindeki Kaynaklardan hiçbir şekilde faydalanamazsınız.

Bazen klasik yol en iyisidir.

+2

, ilk sayfasında bu kütüphaneler bağlıdır çünkü js kodu sayfanın alt kısmında yüklenir ki (jQuery vb) yürütmek olmaz yüklemek (ve bunları yüklemek istemiyorum kafa). – sikrip

+1

jQuery, normalde başa çıkmalı ve ilk önce uygulamalıdır.Buradaki tüm çözümleriniz oldukça zekice olacak çünkü dinamik betik parçalarını etkili bir şekilde geri döndürüyorsunuz, kaynakların ne için tasarlandığı değil. Bu yaklaşım size bazı sorunlara yol açıyor gibi görünüyor, ancak devam etmek isterseniz, ilk sunulan ana GSP'de Kaynak etiketlerini kullanmamanızı öneririm. –

1

Hep Peter Ledbrook tepki ile gitmek, ancak bunun yerine bir düzen kullanmak yerine, bir şablon kullanmak ve ana düzeninde işlemek ne otomatikleştirmek.

<!DOCTYPE html> 
<g:if test="${request.xhr}"> 
    <g:render template="/layouts/content" /> 
</g:if> 
<g:else> 
    <html> 
    ... <!-- Main layout stuff: application resources, logo, main menu, etc --> 
    <div id="content"> <!-- Somewhere in the body --> 
      <g:render template="/layouts/content" /> 
     </div> 
    </html> 
</g:else> 

Sonra _content.gsp şablon gibi görünüyor:

<g:layoutBody /> 
<r:layoutResources disposition="defer"/> 
<!-- Ajaxify your relative links with the framework of your choice --> 

Bu şekilde, otomatik olarak ajaxify tüm göreli bağlantılar ve formlar ve hiçbir işlem gerekmez My main.gsp aşağıdaki gibi görünür ajax cevabı her zaman içerik div içerisine girdiğinden, kontrolörde (farklı cevap yok).

+0

BTW Genelde tüm göreli linkleri ajaxify için kendi ajaxify fonksiyonu ile gidiyorum ... Sadece birisi ilgilendiğinde: https://github.com/deigote/ajaxify/ – Deigote