2012-05-19 10 views
8

मुझे एक फॉर्म टेक्स्टफील्ड को सत्यापित करने की आवश्यकता है जो एम्बरजेएस का उपयोग कर मॉडल की संपत्ति से जुड़ा हुआ है। मैं चाहता हूं कि उपयोगकर्ता केवल वैध, सकारात्मक संख्या टाइप करने में सक्षम हो।फ्लाई पर EmberJS TextField मान्य करें?

मुझे jQuery.isNumber() के बारे में पता है, लेकिन मुझे नहीं पता कि इसे क्षेत्र में कैसे तारित किया जाए। मैंने Ember.computed (...) का उपयोग कर मॉडल की संपत्ति पर स्पष्ट गेटर/सेटर फ़ंक्शन लिखने का प्रयास किया, लेकिन यह काम नहीं किया।

क्या WinForms onChanging() ईवेंट के समान कुछ है जो मैं कर सकता हूं?

+0

आप पुराने ब्राउज़र के लिए देखभाल न, तो आप एचटीएमएल 5 इनपुट प्रकार "संख्या" का लाभ उठाने के रूप में अच्छी तरह से की तरह लग सकता है,।टेक्स्टफ़िल्फ़ प्रकार = "संख्या" मान बाइंडिंग = "कुछ बाइंडिंग"}} – Rajat

+0

@राजत तो पुराने ब्राउज़र के साथ क्या होगा? टूटी हुई कार्यक्षमता या बस कोई सत्यापन नहीं? और 'पुराना' माना जाता है? (क्षमा करें, मैं इस क्षेत्र में एक नोब हूं) –

+0

वे बस एक नियमित टेक्स्टफील्ड में फॉलबैक करेंगे। ब्राउज़र समर्थन पर quirksmode जांचें: http://www.quirksmode.org/html5/inputs.html – Rajat

उत्तर

14

तरीके बात की इस तरह करने के लिए की एक संख्या हैं। यहां हम बाइंडिंग और पर्यवेक्षकों का उपयोग करके इसे पूरा कर सकते हैं।

सबसे पहले एक ऐसा फ़ंक्शन बनाएं जो हमेशा एक नंबर लौटाए।

var onlyNumber = function(input) { 
    return input.toString().replace(/[^\d.]/g, ""); 
}; 

का उपयोग करना है कि हमें निम्न

App = Ember.Application.create(); 

App.person = Ember.Object.create({ 
    age: 42 
}); 

App.NumberField = Ember.TextField.extend({ 
    valueBinding: Ember.Binding.from("App.person.age").transform(onlyNumber), 

    _cleanValue: function() { 
     this.set('value', onlyNumber(this.get('value'))); 
    }.observes('value') 
}); 

1) हम व्यक्ति की उम्र के लिए एक बाध्यकारी बना रहे हैं कर सकते हैं, लेकिन कुछ भी है कि इस बंधन से होकर गुजरता है केवल एक नंबर हो सकता है। अधिक जानकारी के लिए Ember.Binding परिवर्तन/से देखें।

2) हम टेक्स्ट फ़ील्ड के मान को देख रहे हैं और इसे बदलने पर केवल एक संख्या होने के लिए सेट कर रहे हैं। यदि उपयोगकर्ता '42 ए' में प्रवेश करता है तो हम उसे तुरंत '42' पर सेट कर देंगे। ध्यान दें कि भले ही '42 ए' टेक्स्ट इनपुट में एक संक्षिप्त सेकेंड के लिए था, फिर भी यह हमारे ट्रांसफॉर्म के कारण बाध्यकारी से गुजरने में सक्षम नहीं होता।

यहां इस उदाहरण दिखा एक बेला है: http://jsfiddle.net/nDBgC/

+0

बहुत बढ़िया! विस्तृत स्पष्टीकरण के लिए धन्यवाद। –

+0

मैंने परिवर्तनों को देखा और स्पष्ट रूप से एक शॉर्टेंड है यदि ट्रांसफॉर्म के दोनों दिशाएं समान कार्य करती हैं। मैंने इसे प्रतिबिंबित करने के लिए उत्तर संशोधित किया है। –

+3

मुझे लगता है कि सत्यापन कोड मॉडल की तुलना में मॉडल में अधिक समझ में आता है, आपका 'पर्यवेक्षक' विचार बिल को पूरी तरह से फिट करता है, और कोई कस्टम बाइंडिंग (या कस्टम दृश्य) की आवश्यकता नहीं होती है। मैंने आपके उदाहरण से एक बेवकूफ (बीटीडब्ल्यू यह गंदे लगता है) फोर्क किया है: http://jsfiddle.net/L6vmc/4/ –

3

आप अपने TextField पर एक keyDown ईवेंट हैंडलर जोड़ने के लिए, http://jsfiddle.net/pangratz666/SKJfF/ देख सकते हैं:

App.NumberTextField = Ember.TextField.extend({ 
    // implementation of this function, see http://stackoverflow.com/a/995193/65542 
    keyDown: function(event) { 
     // Allow: backspace, delete, tab, escape, and enter 
     if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 || 
     // Allow: Ctrl+A 
     (event.keyCode == 65 && event.ctrlKey === true) || 
     // Allow: home, end, left, right 
     (event.keyCode >= 35 && event.keyCode <= 39)) { 
      // let it happen, don't do anything 
      return; 
     } 
     else { 
      // Ensure that it is a number and stop the keypress 
      if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
       event.preventDefault(); 
      } 
     } 
    } 
});​ 
+4

मैन, यह मेरे लिए एएसएम जैसा दिखता है। यह ब्राउज़र-एएसएम की तरह है। –

+0

आपने कहा "मैं चाहता हूं कि उपयोगकर्ता केवल वैध, सकारात्मक संख्या टाइप कर सके।" यही स्निपेट करता है ... – pangratz

+0

"यह स्निपेट यही करता है" -> मैंने बहुत सारे कोड देखे हैं जो उन्हें करना चाहिए ... लेकिन वे अभी भी एक डरावनी हो सकते हैं। – yagooar

1

कोड (केवल संख्यात्मक इनपुट के प्रबंधन और स्ट्रिंग के बजाय संख्या के बंधन की अनुमति देता है, अगर वांछित):

App.NumberFieldComponent = Ember.TextField.extend({ 
    tagName: "input", 
    type: "number", 

    numericValue: function(key, value) { 
    if (arguments.length === 1) { 
     return parseFloat(this.get("value")); 
    } else { 
     return this.set("value", (value !== void 0 ? "" + value : "")); 
    } 
    }.property("value"), 

    didInsertElement: function() { 
    return this.$().keypress(function(key) { 
     if ((key.charCode !== 46) && (key.charCode !== 45) && (key.charCode < 48 || key.charCode > 57)) { 
     return false; 
     } 
    }); 
    } 
}); 

टेम्पलेट:

{{number-field numericValue=someNumericProperty}} 
0

यह नवीनतम एम्बर संस्करण (एम्बर-क्ली 2.0) के लिए एक अद्यतन उत्तर (@neverfox से) है। यह coffeescript में लिखा है, और थोड़ा becomeFocus उदाहरण (http://guides.emberjs.com/v1.10.0/cookbook/user_interface_and_interaction/focusing_a_textfield_after_its_been_inserted/)

  1. मिलान करने के लिए घटक उत्पन्न बदल: एप्लिकेशन

    एंबर जी घटक संख्या मैदान

  2. बदलें खाका कोड (/components/number-field.coffee)

`import Ember from 'ember'` 
 
    
 
    NumberFieldComponent = Ember.Component.extend 
 
     tagName: "input" 
 
     type: "number" 
 
    
 
    \t numericValue: ((key, value) -> 
 
    \t \t if arguments.length == 1 
 
    \t \t \t parseFloat(this.get('value')) 
 
    \t \t else 
 
    \t \t \t return this.set("value", (value? ? "" + value : "")) 
 
    \t).property('value') 
 
    
 
    \t assignFilter: (-> 
 
    \t \t this.$().keypress (key) -> 
 
    \t \t \t if ((key.charCode != 46) && (key.charCode != 45) && (key.charCode < 48 || key.charCode > 57)) 
 
    \t \t \t \t false 
 
    \t).on('didInsertElement') 
 
      \t \t 
 
    
 
    `export default NumberFieldComponent`
को {{एंबर देखने:

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