2013-05-01 6 views
12

मेरे पास मेरे नॉकआउट व्यू मॉडल में एक अवलोकन योग्य नाम फ़ील्ड है। अब मैं इस फ़ील्ड में वर्णों की संख्या को सीमित करना चाहता हूं यदि यह निश्चित संख्या से अधिक हो।नॉकआउट: एक अवलोकन योग्य क्षेत्र में वर्णों की संख्या सीमित करें

अगर नाम = "जॉन स्मिथ" के रूप में और मैं तो 6 वर्ण की सीमा
प्रदर्शन है "जॉन रों ..."

उत्तर

18

एक और पुन: प्रयोज्य समाधान पाठ का एक छंटनी संस्करण प्रदर्शित करता है कि एक कस्टम बाध्यकारी बनाने के लिए है।

यह अंतर्निहित मूल्य अप्रभावित रहने की अनुमति देता है, लेकिन प्रदर्शन उद्देश्यों के लिए पाठ को ट्रिम करता है। यह किसी संदेश पूर्वावलोकन की तरह, या ग्रिड कॉलम में डेटा को फ़िट करने के लिए उपयोगी होगा।

उदाहरण बाध्यकारी:

ko.bindingHandlers.trimLengthText = {}; 
ko.bindingHandlers.trimText = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var trimmedText = ko.computed(function() { 
      var untrimmedText = ko.utils.unwrapObservable(valueAccessor()); 
      var defaultMaxLength = 20; 
      var minLength = 5; 
      var maxLength = ko.utils.unwrapObservable(allBindingsAccessor().trimTextLength) || defaultMaxLength; 
      if (maxLength < minLength) maxLength = minLength; 
      var text = untrimmedText.length > maxLength ? untrimmedText.substring(0, maxLength - 1) + '...' : untrimmedText; 
      return text; 
     }); 
     ko.applyBindingsToNode(element, { 
      text: trimmedText 
     }, viewModel); 

     return { 
      controlsDescendantBindings: true 
     }; 
    } 
}; 

इस तरह यह प्रयोग करें:

<div data-bind="trimText: myText1"></div> 

या ...

<div data-bind="trimText: myText1, trimTextLength: 10"></div> 

See Fiddle

+1

मुझे यह समाधान पसंद आया; मैं सिर्फ मूल मूल्य का तेज़ पूर्वावलोकन प्रदान करने के लिए तत्व के शीर्षक में असीमित पाठ डालने का सुझाव देना चाहता हूं; कुछ "element.title = untrimmedText;" अगर untrimmedText लंबाई अधिकतम लंबाई से अधिक है। – CaNNaDaRk

+1

बस एक छोटी टिप्पणी - यह जांचना अच्छा होगा कि अनछुए पाठ की लंबाई (trimTextLenth + 3) से अधिक है, क्योंकि यदि trimTextLenth 5 बराबर है, लेकिन पाठ "123456" है, तो परिणाम "12345 ..." होगा, जो असीमित संस्करण से लंबा है। –

+0

मैंने यूसुफ के जवाब और इस पहेली में इवान की टिप्पणी का उपयोग किया है: http: //jsfiddle.net/8ypdX/90/। यह truncateText नामक एक चर बनाता है जो आपको छंटनी के लिए उपयोग किए गए पाठ को परिभाषित करने की अनुमति देता है, और उस चर की लंबाई को मापता है। यदि छंटनी पाठ प्लस कटाव टेक्स्ट मूल स्ट्रिंग से अधिक है तो यह ट्रिम निष्पादित नहीं करता है। – RussAwesome

15
<span data-bind="text: (name.length > 6 ? name().substring(0, 5) + '...' : name)"></span> 

या फिर आप अपने ViewModel में एक गणना की नमूदार बना सकते हैं, इस तरह के के रूप में:

var self = this; 

this.shortName = ko.computed(function() { 
    return (self.name.length > 6 ? self.name().substring(0, 5) + '...' : self.name); 
}); 

और उसके बाद:

<span data-bind="text: shortName"></span> 
+0

धन्यवाद क्रिस .. यह मेरे लिए काम करता है .. – xyz

+0

मैं() अपने पहले उदाहरण में आपको याद किया लगता है के बाद पहले '' 'n: maxLength इस प्रकार बंधन ame''', जैसा कि: '' 'span data-bind =" text: (name()। length> 6? नाम()। substring (0, 5) + '...': नाम) ">' ' – f055

+1

नॉकआउट में आप अभिव्यक्ति का मूल्यांकन किए बिना .length का उपयोग कर सकते हैं()। –

7

क्रिस डिक्सन की समाधान सही हैं यदि आपके पास एक फ़ील्ड है जिसमें अधिकतम लंबाई है। लेकिन अगर आपको इस ऑपरेशन को कई बार दोहराना पड़ता है तो यह बोझिल हो जाता है।

ko.extenders.maxLength = function(target, maxLength) { 
    //create a writeable computed observable to intercept writes to our observable 
    var result = ko.computed({ 
     read: target, //always return the original observables value 
     write: function(newValue) { 
      var current = target(), 
       valueToWrite = newValue ? newValue.substring(0, Math.min(newValue.length, maxLength)) : null; 

      //only write if it changed 
      if (valueToWrite !== current) { 
       target(valueToWrite); 
      } else { 
       //if the rounded value is the same, but a different value was written, force a notification for the current field 
       if (newValue !== current) { 
        target.notifySubscribers(valueToWrite); 
       } 
      } 
     } 
    }); 

    //initialize with current value to make sure it is rounded appropriately 
    result(target()); 

    //return the new computed observable 
    return result; 
}; 

इसके बाद आप किसी भी नमूदार पर इसका इस्तेमाल कर सकते हैं और आप उनमें से किसी के लिए एक अलग अधिकतम लंबाई निर्दिष्ट कर सकते हैं: है कि जब आप एक कस्टम नमूदार एक्सटेंडर लिखना चाहिए, इस तरह है। यह एचटीएमएल (समाधान 1) से अव्यवस्था को हटाता है, और एक गणना किए गए अवलोकन योग्य (समाधान 2) लिखने की आवश्यकता को हटा देता है। आप बस अपनी नमूदार निम्नलिखित तरीके से परिभाषित करते हैं:

this.shortName = ko.observable().extend({ maxLength: 25 }); 
+0

बस स्पष्ट होने के लिए, जब देखने योग्य (सेटिंग) लिखते हैं, तो यह अधिकतम मानदंड से अधिक किसी भी मान को छोटा कर देगा, सही? –

+0

@ जोसेफ गैब्रियल बिल्कुल। – Jalayn

+0

यह समाधान इनपुट में दिखाई देने वाले वर्णों को सीमित नहीं करता है। – jmathew

2

आप के लिए मूल्य काटना चाहते हैं एक संख्यात्मक i Nput आप इस्तेमाल कर सकते हैं और एक्सटेंडर कि निम्नलिखित की तरह मूल्य काटना होगा:

ko.bindingHandlers.maxLength = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     'use strict';      

     var maxlength = element.getAttribute("maxlength"); 

     valueAccessor().extend({truncateValue: maxlength }) 
     ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor, viewModel);  
    } 
}; 

अपने html आप लागू पर:

ko.extenders.truncateValue = function(target, option) {        
     target.subscribe(function (newValue) { 
      if(newValue.length > option){ 
       target(newValue.substring(0,option)); 
      }      
     }); 

     return target; 
    }; 

और फिर नमूदार को एक्सटेंडर जोड़ देंगे, एक कस्टम बाध्यकारी कि इच्छा बनाने

<input type="number" data-bind="maxLength: yourObservable" maxlength="9"></input> 
+0

मुझे पूरा यकीन है कि 'valueAccessor()' 'maxLength' प्रॉपर्टी का मान वापस कर देगा, जो कि आप तत्व के लिए बाध्य अवलोकन योग्य नहीं हैं। – jmathew

+0

@jmathew आशा है कि यह संपादन के साथ अब और अधिक समझ में आता है, मैंने बाध्यकारी के साथ एचटीएमएल जोड़ा। –

+0

valueAccessor - एक जावास्क्रिप्ट फ़ंक्शन जिसे आप इस बाध्यकारी में शामिल वर्तमान मॉडल प्रॉपर्टी प्राप्त करने के लिए कॉल कर सकते हैं। वर्तमान मॉडल संपत्ति मान प्राप्त करने के लिए किसी भी पैरामीटर को पारित किए बिना इसे कॉल करें (यानी, कॉल वैल्यू एक्सेसर())। आसानी से दोनों सादे मूल्यों को स्वीकार करने के लिए, लौटाए गए मूल्य पर ko.unwrap को कॉल करें। –

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