2012-05-22 12 views
6

मुझे यकीन नहीं है कि यह कैसे किया जाता है। मैं उस मार्ग को कड़ी मेहनत कर सकता हूं जिसका मैं उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं इसे सही तरीके से करना चाहता हूं।एक प्ले टेम्पलेट में जावास्क्रिप्ट और स्कैला मिलाकर

मेरे पास एक ड्रॉपडाउन है जिसे परिवर्तन पर एक नया पृष्ठ लोड करने की आवश्यकता है। यहाँ मूल रूप से मैं कैसे यह करने के लिए कोशिश कर रहा हूँ है (मैं इस के कुछ रूपों की कोशिश की है):

@getRoute(value: String) = @{ 
    routes.Accounts.transactions(Long.valueOf(value)) 
} 

    <script type="text/javascript"> 
     $(function() { 

     $("select[name='product']").change(function() { 

      location.href = @getRoute($(this).val()); 
     }).focus(); 

     $('a.view.summary').attr('href', "@routes.Accounts.index()" + "?selectedAccountKey=" + $('select[name=product]').val()); 
     }); 
    </script> 

यह एक identifier expected but 'val' found अपवाद पैदा करता है। मैंने उद्धरणों में इसके आस-पास की कोशिश की, लेकिन इससे [NumberFormatException: For input string: "$(this).val()"]

तो मैं जावास्क्रिप्ट से एक स्कैला फ़ंक्शन में कैसे मूल्य डालूं?

संपादित

यहाँ मेरी समाधान, स्वीकार किए जाते हैं जवाब से प्रेरित है। यह ड्रॉपडाउन एक टैग में परिभाषित किया गया है जो विभिन्न घटकों द्वारा पुन: उपयोग के लिए बनाया गया है, और बेस यूआरएल प्रत्येक घटक के लिए अलग है।

@(accountList: List[models.MemberAccount], 
    selectedAccountKey: Long, 
    urlGenerator: (Long) => Html 
) 

<select name="product"> 
    @for(account <- accountList) { 
    @if(account.accountKey == selectedAccountKey) { 
     <option selected="selected" value="@urlGenerator(account.accountKey)">@account.description (@account.startDate)</option> 
    } else { 
     <option value="@urlGenerator(account.accountKey)">@account.description (@account.startDate)</option> 
    } 
    } 
</select> 

<script type="text/javascript"> 
$(function() { 
    $('select[name=product]').change(function() { 
     location.href = $(this).val(); 
    }); 
}); 
</script> 

तो फिर तुम में पारित करने के लिए इस तरह एक समारोह को परिभाषित कर सकते हैं:: जिस तरह से इस लक्ष्य को हासिल करने के लिए एक समारोह है कि लटकती में एक खाता कुंजी के आधार पर URL जेनरेट करती है पारित करने के लिए था

@transactionsUrl(memberAccountKey: Long) = { 
    @routes.Accounts.transactions(memberAccountKey) 
} 

@accountsDropdown(transactionDetails.getMemberAccounts(), transactionDetails.getMemberAccountKey(), transactionsUrl) 
+1

आप गलत तरीके से इस बारे में सोच रहे हैं। जावास्क्रिप्ट को क्लाइंट साइड पर निष्पादित किया जाता है, जबकि स्केल को सर्वर की ओर से निष्पादित किया जाता है! उस दिशा में दोनों के बीच संवाद करने का एकमात्र तरीका (जावास्क्रिप्ट से स्कैला) एक पोस्ट या जीईटी के साथ है। –

+0

हां, आप सही हैं, पृष्ठ को प्रस्तुत करने से पहले उन स्कैला स्टेटमेंट को संसाधित करने की आवश्यकता है। मैं निश्चित रूप से उस मार्ग के मूल्य को प्राप्त करने के लिए बस एक आरईएसटी कॉल नहीं करना चाहता हूं। मेरी इच्छा है कि कॉल करने या जेएस में रूट को हार्डकोड किए बिना गतिशील रूप से ऐसा करने का कोई तरीका था। – Samo

+0

क्या आप इसे रूटिंग का हिस्सा बना सकते हैं? 'Location.href = '/ products /' + $ (this) .val(); 'फिर इसे रूट कॉन्फ़िगर/नियंत्रक में संभाल लें। शायद आपके केस विनिर्देशों के बारे में अधिक जानकारी हमें बेहतर समाधान खोजने में मदद करेगी, अभ्यास में "$ (यह) .val()" क्या है? –

उत्तर

6

आप पृष्ठ में सभी यूआरएल संग्रहीत करने के तरीके की आवश्यकता है, उदाहरण के लिए

<option value="@routes.Accounts.transactions(id)">Display</option> 

फिर onChange, आप:

$("select[name='product']").change(function() { 
    location.href = $(this).val(); 
}); 
+0

उत्कृष्ट विचार! मेरे पास बस एक प्रमुख था "मैं उस क्षण के बारे में क्यों नहीं सोचता था" पल। – Samo

+0

मुझे कोई कारण नहीं दिखता कि यह क्यों काम नहीं करेगा, लेकिन मैं अभी भी यह सुनिश्चित करने के लिए पहले कोशिश करना चाहूंगा कि कोई गठिया नहीं है, और मुझे अभी तक मौका नहीं मिला है। यदि मैं इसे आज़माता हूं और यह काम करता है, तो आपको अपनी हरी टिक और आपके 15 अंक मिलेंगे :-) – Samo

+0

पर्याप्त मेला - धन्यवाद! –

संबंधित मुद्दे