2013-03-21 11 views
8

के साथ एक jQuery प्लगइन से AngularJS मॉडल अपडेट करें मैं एक टच स्क्रीन कंप्यूटर के लिए एक वेब ऐप बना रहा हूं जिसके लिए ऑन-स्क्रीन कीबोर्ड की आवश्यकता है और मैं इस उत्कृष्ट का उपयोग करने का प्रयास कर रहा हूं (या कम से कम केवल एक मैं यह पाया कि वह भयानक नहीं था) कीबोर्ड। https://github.com/Mottie/Keyboard/एक "प्लगइन" कॉलबैक

समस्या यह है कि, जैसा कि आपने पहले ही अनुमान लगाया होगा, कि ऑन-स्क्रीन कीबोर्ड का उपयोग करते समय मॉडल अपडेट नहीं होता है। यह मेरा कोड, काम करता है की तरह जो है, लेकिन यह बदसूरत के सभी प्रकार:

partitial एचटीएमएल: तो पर

$('.keyboard') 
.keyboard({ 
    stickyShift: false, 
    usePreview: false, 
    autoAccept: true, 

    change: function(e, kb, el) { 
     $scope.newUser.name = el.value; 
    } 
}); 

:

<input type="text" class="keyboard" ng-model="newUser.name"> 
<input type="text" class="keyboard" ng-model="newUser.email> 

कुंजीपटल शुरु कर रहा है, partitial पेज नियंत्रक से jQuery प्लगइन द्वारा ट्रिगर किया गया परिवर्तन मैं कुछ चला सकता है। जाहिर है, यह केवल एक फ़ील्ड/मॉडल को अपडेट करने में काम करता है, नाम एक (जबकि ईमेल कोई भी काम नहीं करता है और नाम फ़ील्ड को ओवरराइट करेगा), कीबोर्ड के साथ उपयोग किए जाने पर मुझे अपडेट करने के लिए किसी भी फ़ील्ड की आवश्यकता होती है, और सही वाला। मैं इसे कम भयानक, हार्डकोडेड (यदि संभव हो और बहुत जटिल नहीं) तरीके से कैसे हल करूं?

+0

उत्कृष्ट कीबोर्ड की कीबोर्ड विधि को कॉल करने के लिए निर्देश का उपयोग करें। उस स्थिति में आप तत्व के ngModel हो सकता है। – Abilash

+0

कोणीय-ui.js के ui-select2 के समान कुछ सुझाव देना – Abilash

+0

क्या कोणीय-UI आवश्यक है या इसके लिए भी सहायक है? इस विशेष समस्या के लिए एक साधारण टेक्स्ट फ़ील्ड से अधिक कुछ भी अधिक है, जब तक कि इसमें पहले से ही एक बेहतर ऑन-स्क्रीन कीबोर्ड भी शामिल न हो। –

उत्तर

12

कोणीय में इसे लिखने का तरीका वास्तव में एक निर्देश लिखना है। आप किसी विशेष वर्ग के नाम के साथ निर्देश का आकलन कर सकते हैं।

तो, अपने निर्देश अब की तरह

app.directive('keyboard',function(){ 
    return { 
    require : '?ngModel', 
    restrict : 'C', 
    link : function(scope,element,attrs,ngModelCtrl){ 
     if(!ngModelCtrl){ 
     return; 
     } 
     $(element).keyboard({ 
     stickyShift: false, 
     usePreview: false, 
     autoAccept: true, 

     change: function(e, kb, el) { 
      ngModelCtrl.$setViewValue(el.value); 
     } 
    }); 
    } 
    }; 
}); 

कुछ ऐसा दिखाई देगा अगर किसी भी तत्व दोनों कीबोर्ड और एनजी मॉडल का एक वर्ग तो परिभाषित किया है, अपने कीबोर्ड पॉप अप चाहिए। उम्मीद है की यह मदद करेगा।

+0

यह सुनिश्चित करता है कि, यह बहुत अच्छा काम करता है। मैं AngularJS के लिए नया हूं और वेब प्रोग्रामिंग में पृष्ठभूमि नहीं है लेकिन मैं यह कह सकता हूं कि यह काम करने के लिए अच्छा ढांचा है। मुझे निर्देशों का उपयोग कब करना है, यह जानने की कोशिश करनी होगी। –

+0

वाह .. मैंने उस अंधे को लिखा .. तो, किसी भी संशोधन के बिना इसे काम करने की उम्मीद है। यदि आपको डीओएम में हेरफेर करने या डीओएम से पूछताछ करने और तत्व को पकड़ने की आवश्यकता है, तो आपको आम तौर पर निर्देश की आवश्यकता होगी। – ganaraj

+0

मुझे उम्मीद है कि आपको 'तत्व' को '$ (तत्व)' के रूप में लपेटने की आवश्यकता नहीं है क्योंकि यह पहले से ही 'jQuery' ऑब्जेक्ट है। –

2

मैंने गणराज निर्देश का संशोधन किया। अब मॉडल कीबोर्ड बटन के हर क्लिक पर अपडेट हो रहा है।

app.directive('keyboard',function(){ 
    return { 
    require : '?ngModel', 
    restrict : 'C', 
    link : function(scope,element,attrs,ngModelCtrl){ 
     if(!ngModelCtrl){ 
     return; 
     } 

     $(element).keyboard({ 
     stickyShift: false, 
     usePreview: false, 
     autoAccept: true, 

     change: function(e, kb, el) { 
      if(!scope.$$phase && !scope.$root.$$phase) 
      { 
       scope.$apply(function(){ 
        ngModelCtrl.$setViewValue(el.value); 
       }); 
      } 
     } 
    }); 
    } 
    }; 
}); 
संबंधित मुद्दे