2011-03-08 12 views
12

मैं नॉकआउटजेएस और नोड.जेएस के साथ एक छोटा चैट क्लाइंट/सर्वर ऐप लिख रहा हूं, तथ्य यह है कि, जब मैं एक संदेश भेजता हूं, तो संदेश संदेश पर ध्यान केंद्रित करता हूं, और उपयोगकर्ताओं को इसे फिर से क्लिक करना पड़ता है हर बार वे टाइप करना चाहते हैं (बहुत परेशान)। क्या आप जानते हैं कि मैं क्या कर सकता हूं? यहाँ टेम्पलेट है:एक फ़ील्ड को ऑटो फोकस कैसे करें?

<script type="text/html" id="chatRoom"> 
<div id="chatContainer" class="chatContainer"> 
    <div class="chatFrom"> 
     <i id="chatClose" class="chatSprite chatClose" data-bind='click: function() { server.removeChat(this) }'></i> 
    </div> 
    <div class="chatMessages"> 
     <ul id="chatHolder"> 
     {{each messages()}} 
      <li><div class="chatFromText">From: ${ from }</div> 
      <div class="chatTime">${ time }</div><div class="chatMsg">${ text }</div></li> 
     {{/each}} 
     </ul> 
    </div> 
    <div class="chatControls"> 
    <form data-bind="submit: function() { send($('#'+channel).val()); $('#'+channel).focus(); }"> 
     <input type="text" id="${ channel }" name="message" class="chatText" style="color: #999;" value="Message Here" data-bind='click: function() { 
      $("#"+channel).val("").css("color", "#000"); 
     }' /> 
     <i class="chatSprite chatSend" data-bind="click: function() { $('.chatSend').parent().submit() }"></i> 
    </form> 
    </div> 
</div> 
</script> 

आप देख सकते हैं मैं क्षेत्र ध्यान केंद्रित करने के हर संभव तरीके से कोशिश की है, लेकिन कोई भी काम करने के लिए लग रहे हैं। कोई सुझाव?

उत्तर

12

मुझे लगता है कि आपकी समस्या यह है कि आपकी "प्रेषण" विधि सर्वर पर एक एसिंक्रोनस पोस्ट वापस करती है, सफलता कॉलबैक में यह शायद आपके संदेशों को संदेश को अवलोकन करने के लिए धक्का देती है। जब ऐसा होता है तो आपका टेम्पलेट पुनः प्रस्तुत किया जाता है और आपका ध्यान खो जाता है। तो, यह आपके $('#'+channel).focus() कॉल के बाद होता है, क्योंकि प्रेषण अतुल्यकालिक रूप से पूरा करता है।

आपके प्रेषण समारोह को देखे बिना सुनिश्चित नहीं हो सकता है।

एक विकल्प "चैनल" को आपके "प्रेषण" फ़ंक्शन में एक और पैरामीटर के रूप में पारित करना होगा, फिर आपके संदेशों को संदेश को धक्का देने के बाद आपके AJAX अनुरोध के लिए सफलता कॉलबैक में अरायरे चैनल पर आधारित फ़ोकस सेट करें।

यहाँ नमूना: http://jsfiddle.net/rniemeyer/h2A6p/

+0

आरपी, तुम मेरे दोस्त एक मास्टर कर रहे हैं! आप एसिंक कॉल और टेम्पलेट के पुन: प्रस्तुत करने के बीच के समय के बारे में सही थे, इसलिए मैंने इसे सही जगह पर रखा और यह काम किया! आपको फिर से धन्यवाद – Jose

+0

अरे आरपी, मुझे लगता है कि knockout-latest-debug.js फ़ाइल का लिंक टूटा हुआ है। तो jsfiddle उदाहरण भी टूटा हुआ है। मैंने पहले एक ही मुद्दे को समझ लिया है। बस आपको बताना चाहता था। –

+0

धन्यवाद। गीथूब पर बिल्ड आउटपुट से बहुत पुरानी पहेलियों को जोड़ा गया था, जो अब केओ के लिए मौजूद नहीं है। मैंने पहेली को अपडेट किया। अगर आप किसी अन्य को देखते हैं तो मुझे बताएं। –

9

नॉकआउट अब एक hasfocus बाध्यकारी है।

1

कारण यह है कि आपके भेजने समारोह अतुल्यकालिक किया जा रहा है,

या तो, async = false सेट अगर आप ajax

वैकल्पिक रूप से, उपयोग कर रहे हैं यदि आप एक boolean मूल्य धारण करने के लिए एक दृश्य के मॉडल संपत्ति का उपयोग करें और hasfocus उपयोग कर सकते हैं बाध्यकारी

function chatVM() 
{ 
    this.focus = ko.observable(true); 
} 
var vm = new chatVM(); 

और फिर अपने अंदर प्रस्तुत समारोह

set vm.focus(true); 

या

हमेशा सच करने के लिए अपने संदेश बॉक्स के hasfocus निर्धारित किया है।

div class="msgbox" data-bind="hasfocus: ko.observable(true)"></div> 
2

अरान की और अरुण के जवाब का मेल, सबसे आसान तरीका है कि मेरे लिए काम करता है:

<input id="channel" type="text" data-bind="hasfocus: true" /> 
संबंधित मुद्दे