попробуйте этот код, я переписал некоторые коды
import {
AfterViewInit,
Directive,
ElementRef,
HostListener,
Input,
OnInit,
Renderer2,
OnDestroy
} from '@angular/core';
@Directive({
selector: '[appInputmaxLength]'
})
export class InputmaxLengthDirective implements OnInit, AfterViewInit, OnDestroy {
@Input() appInputmaxLength: string;
private currentValue = 0;
countDiv: HTMLDivElement;
parent: any;
constructor(private el: ElementRef<HTMLInputElement>, private renderer: Renderer2) {}
@HostListener('keyup') isChange() {
const countNb = this.el.nativeElement.value.length + 1;
if (countNb <= 1) {
this.currentValue = 0;
this.updateCount();
} else {
this.currentValue = countNb;
this.updateCount();
}
console.log('test: ', this.el.nativeElement.value.length + 1);
}
ngOnInit() {
this.renderer.setAttribute(this.el.nativeElement, 'maxLength', this.appInputmaxLength);
}
ngOnDestroy() {
this.renderer.removeChild(this.parent, this.countDiv);
this.renderer.destroyNode(this.countDiv);
}
updateCount() {
this.countDiv.innerText = this.currentValue + ' / ' + this.appInputmaxLength;
}
ngAfterViewInit() {
this.countDiv = this.renderer.createElement('div');
this.parent = this.renderer.parentNode(this.el.nativeElement);
this.renderer.appendChild(parent, this.countDiv);
this.updateCount();
}
}
в этом коде, я использую рендерер для создания элемента div и обновления его значения везде, где изменяется currentValue
.
Также вы должны уничтожить его при уничтожении директивы, чтобы избежать утечки памяти.
Повышение имеет невообразимое число библиотек. Легкие для начала работы на
Более усовершенствованные включают
Привыкание для повышения занимает время, но я уверяю Вас, что оно сделает Вашу жизнь намного лучше. Плюс, смотря на то, как библиотеки повышения кодируются, поможет Вам поправиться при кодировании C++, особенно шаблоны.
Вы упомянули то, что должно Вы искать прежде, чем попробовать повышение. Я соглашаюсь, что функциональные объекты являются большой вещью исследовать. Кроме того, удостоверьтесь, что искали о шаблонном программировании. Типичная проблема удостовериться Вы знаете, когда использовать typename
спецификатор для зависимых типов. По большей части, однако, библиотеки очень хорошо документируются с примерами и ссылочными материалами.
Изучение повышения обсуждено здесь. Что касается функций языка, которые полезны? Все они. C++ является опасным языком, чтобы использовать, если Вы не знаете достаточно его. RAII, функторы/функциональные объекты и шаблоны, вероятно, покрывают самые важные аспекты. Повышение разработано так же к STL, так зная, что Ваша стандартная библиотека важна. Само повышение использует много шаблонного метапрограммирования, но как пользователь библиотеки, Вам не часто будет нужно это (если Вы не начнете играть с Повышением. MPL)
Ошибки, связанные с управлением памятью, являются хорошим индикатором, что это - C++, а не Повышение, на котором необходимо повторить. Методы для обработки памяти безопасно известны, и не характерны для Повышения. (За очевидным исключением интеллектуальных указателей Повышения). RAII является, вероятно, самым важным понятием для понимания для контакта с этим видом проблем.
Каковы ключевые функции языка, на которых я должен полировать эффективно извлечь выгоду из использования повышения и сократить кривую обучения?
... среди других.
есть ли любые учебные руководства и 101 ресурс, на которые я могу быстро посмотреть просто получить ощущение и понимающий при использовании повышения.
Повышение хорошо документируется. Запустите здесь.
Существует слишком много библиотек, чтобы потеряться. Я сказал бы, запускаются с чего-то простого, возможно, интеллектуальные указатели или Повышение. Тест (Платформа модульного теста) - который быстро поможет Вам начать. Кроме того, попытайтесь думать о проблеме, которую Вы не можете решить с STL легко. Затем ищите документацию Повышения или сообщение здесь.
Если Вы довольны функциональным программированием, смотрят на библиотеки MPL/Lambda.
Первый звон IMO является интеллектуальными указателями. Интеграция в новый код проста, и обычно не проблема для существующего кода. Они делают управление памятью легким, и работа для многих других ресурсов, также.
C++ дает Вам питание управлять Вашей собственной памятью, интеллектуальные указатели позволяют Вам (главным образом) крыло это, когда Вы не должны.
Второе было бы - как Вы упомянули - функциональные объекты, они преодолевают большой разрыв в C++, который традиционно решен посредством наследования, которое является к сильной из связи во многих случаях.
У меня есть только небольшой опыт с повышением вне этих двух, но большая часть остатка является довольно "ситуационной" - Вы можете или, возможно, не нуждаетесь в нем. Получите обзор по библиотекам и посмотрите то, в чем Вы нуждаетесь.
boost::any
и boost::variant
мило с вашей стороны потребность различный тип данных, с двумя разными подходами.
boost::regex
если Вам нужен некоторый текстовый парсинг.
boost::thread
и boost::filesystem
справка Вы пишете портативный код. Если у Вас уже есть хорошая платформа определенные библиотеки, Вам, возможно, не понадобились бы они - но они лучше, чем API или уровень C++ в любом случае.
Возможно, Вам нравится, когда мое введение повышает интеллектуальные указатели и довольно неортодоксальное использование для них.
Попробуйте книгу Björn Karlsson: Вне Библиотеки Стандарта C++: Введение в Повышение. Его довольно простое и легкое для схватывания. Я считал это после того, как я закончил Scott Meyers три книги C++ (эффективный ряд).
После чтения Вне Библиотеки Стандарта C++: Введение в Повышение, я рекомендовал бы небрежно просмотреть документацию относительно boost.org, только понять то, что доступно. Можно сделать глубокое погружение в определенную библиотеку повышения, когда это похоже на подходящий вариант для конкретного приложения.
Я думаю, что shared_ptr должен быть самым легким местом для запуска. Начните использовать его inplaces простого указателя или auto_ptr типов данных.
Можно также изучить weak_ptr.