녹아웃 뷰 모델에 관찰 가능한 이름 필드가 있습니다. 이제 특정 숫자를 초과하는 경우이 필드의 문자 수를 제한하려고합니다.녹아웃 : 관찰 가능 필드의 문자 수 제한
이름 = "존 스미스"경우로그리고 난 다음 6 자로 제한
디스플레이가 "존들 ..."
녹아웃 뷰 모델에 관찰 가능한 이름 필드가 있습니다. 이제 특정 숫자를 초과하는 경우이 필드의 문자 수를 제한하려고합니다.녹아웃 : 관찰 가능 필드의 문자 수 제한
이름 = "존 스미스"경우로그리고 난 다음 6 자로 제한
디스플레이가 "존들 ..."
또 다른 재사용 가능한 솔루션은 텍스트의 트림 된 버전을 표시하는 사용자 지정 바인딩을 만드는 것입니다.
기본 값은 영향을받지 않지만 표시 목적으로 텍스트를 잘라냅니다. 이것은 메시지 미리보기와 같은 것 또는 그리드 열에 데이터를 맞추는 데 유용합니다.
예 바인딩 :
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>
<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>
크리스 딕슨의 솔루션은 최대 길이를 가진 하나의 필드가 있다면 완벽합니다. 그러나이 작업을 여러 번 반복해야하는 경우 작업이 번거로워집니다.
이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;
};
그런 다음 어떤 관찰에 사용할 수 있습니다, 당신은 그 중 하나에 대해 서로 다른 최대 길이를 지정할 수 있습니다 :이 같은 사용자 정의 관찰 익스텐더를 작성해야하는 경우 때문입니다. 이렇게하면 HTML (솔루션 1)에서 혼란을 제거하고 계산 된 관찰 가능 (솔루션 2)을 작성할 필요성을 제거합니다. 관찰 대상을 다음과 같이 정의하면됩니다.
this.shortName = ko.observable().extend({ maxLength: 25 });
당신이 값을 자르려면 숫자 i 당신을 적용하여 HTML에
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);
}
};
: 관찰에 확장을 추가합니다 그 뜻을 사용자 지정 바인딩을 생성 한 후
ko.extenders.truncateValue = function(target, option) {
target.subscribe(function (newValue) {
if(newValue.length > option){
target(newValue.substring(0,option));
}
});
return target;
};
그리고 : nput 당신이 사용할 수 있고 확장 다음과 같이 값을자를 것
<input type="number" data-bind="maxLength: yourObservable" maxlength="9"></input>
저는 'valueAccessor()'는 요소에 바인딩 한 관찰 가능 값이 아닌 'maxLength'속성의 값을 반환합니다. – jmathew
@jmathew 편집으로 더 이해하기를 바란다. html에 바인딩을 추가했다. –
valueAccessor -이 바인딩과 관련된 현재 모델 속성을 가져 오기 위해 호출 할 수있는 JavaScript 함수입니다. 매개 변수 (예 : valueAccessor() 호출)를 전달하지 않고이 메소드를 호출하면 현재 모델 특성 값을 가져올 수 있습니다. 관측 가능 값과 일반 값을 모두 쉽게 받아들이려면 반환 값에 대해 ko.unwrap을 호출하십시오. –
나는이 솔루션을 좋아했습니다. 필자는 원래 값의 빠른 미리보기를 제공하기 위해 트림되지 않은 텍스트를 요소의 제목에 넣을 것을 제안합니다. "element.title = untrimmedText;"와 같은 것입니다. untrimmedText의 길이가 maxLength보다 큰 경우 – CaNNaDaRk
trimTextLenth = 5인데 텍스트가 "123456"이면 결과는 "12345 ..."가 될 것이므로 주석이없는 텍스트의 길이가 (trimTextLenth + 3) 이상인지 확인하는 것이 좋습니다. untrimmed 버전보다 길다. –
저는이 바이올린에서 Joseph의 대답과 Ivan의 주석을 사용했습니다 : http : //jsfiddle.net/8ypdX/90/. truncateText라는 변수를 생성하여 자르기에 사용되는 텍스트를 정의하고 해당 변수의 길이를 측정 할 수 있습니다. 트림 된 텍스트와 잘림 텍스트가 원래 문자열보다 크면 트림을 수행하지 않습니다. – RussAwesome