Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Directive #1

Closed
dyuvzhenko opened this issue Dec 15, 2017 · 17 comments
Closed

Directive #1

dyuvzhenko opened this issue Dec 15, 2017 · 17 comments

Comments

@dyuvzhenko
Copy link
Owner

No description provided.

@dhilt
Copy link
Collaborator

dhilt commented Dec 15, 2017

Склонируй репозиторий еще раз отдельно, и изучи код в мастере (поскольку в dir другая версия Ангуляра, может начаться ад в зависимостях).Ты увидишь рабочую версия компонента. Входная точка (после app.module, конечно) – app.component.ts. Это произвольное приложение. На нем объявлен объект datasource, а в шаблоне значится ui-scroll, которому datasource передается в качестве входного параметра. ng-template размечает шаблон, который будет повторяться скроллером. let-myItem="item" и let-index="index" задают параметры, которые можно использовать в этом шаблоне. Все. Это то, как видит компонент конечный пользователь (программист). То, что лежит в папке ui-scroll никто никогда не увидит. Программист задает datasource и шаблон отображения. Всю остальную работу делает скроллер.

Но мы не хотим, чтобы скроллер был компонентом. Мы хотим, чтобы он был директивой. Чтобы конечный программист писал бы в шаблоне своего приложения

<ul *uiScroll="let item of datasource">
    <li>{{item.text}}</li>
</ul> 

Без ng-template (который не работает в директиве). Я научился пропихивать в директиву datasource (этот код в dir), но не подобрался к item...

@dyuvzhenko
Copy link
Owner Author

dyuvzhenko commented Dec 15, 2017

@dhilt Да, я переключаюсь между двумя репозиториями с бранчами dir и master. Все еще пока что вникаю в детали. Но что нужно сделать и как все примерно должно выглядеть - это уже точно понял.

@dhilt
Copy link
Collaborator

dhilt commented Dec 15, 2017 via email

@dyuvzhenko
Copy link
Owner Author

@dhilt Начал пробовать, вот коммит - 99ed60d.
Выходит ui-scroll полностью отключил (все инициализации на ngOnInit на ./src/app/ui-scroll-directive/ui-scroll.component.ts) и пытаюсь просто отобразить datasource через директиву, стремясь исполнить задаваемый шаблон конечным пользователем. И пока что особо не выходит, ng-template не работает как задумано. На ui-scroll.component.ts следующее объявление переменной дает undefined: @ContentChild(TemplateRef) templateVariable: TemplateRef<any>;, возможно загвоздка в этом.

@dhilt
Copy link
Collaborator

dhilt commented Dec 18, 2017

@khajjit Вижу твои попытки, пока не знаю, как направить их к победе, как заставить {{item}} в app.component.html работать...

@dhilt
Copy link
Collaborator

dhilt commented Dec 19, 2017

@khajjit Я понял, как мы можем поступить, Денис. Обнови Ангуляр до последней версии и воспроизведи в UiScroll код нативного NgFor. Если мы хотим синтаксис ngFor, то надо использовать его нативную имплементацию. Когда удастся сделать клон ngFor, можно будет думать, как подпихнуть туда наш datasource с нашей логикой вытаскивания items, а потом изменить логику отображения с простого линейного вывода на то, что у нас в компоненте сейчас (Workflow etc). Но главное – это добиться работы кастомного ngFor. Я бы просто брал исходный код Ангуляр. Еще можно пытаться смотреть статьи вроде http://www.talkinghightech.com/en/create-ngfor-directive/.

@dyuvzhenko
Copy link
Owner Author

dyuvzhenko commented Dec 19, 2017

@dhilt Удивительно, но точно об этом же я подумал два дня назад, хорошенько вглядеться в исходный код директивы ngFor и написать что-то похожее, но под условия нашей задачи. В дальнейшем значит буду пробовать этот подход.
А пока что я пытался немного замысловато пропихнуть templateRef. Попытка была следующей - сохранить этот объект на объявлении директивы, сохранить через сервис. Далее при объявлении подопечного компонента ui-scroll.component.ts установить этот объект в качестве переменной templateVariable. И тег ng-template по-своему заработал, только мне не удалось добиться подстановки значений для spec_item (ранее item в app.component.html), показывается только строка "Hello uiScroll Directive." из app.component.html. Быть может, все же можно было бы добиться удачной работы с таким подходом, но я похоже не учел одной важной детали - с таким кодом конечному пользователю не удастся задавать переменные только в app.component.html, для нормальной работы их нужно дублировать еще и в ui-scroll.component.html. В общем, тупик пожалуй. Но у вас может появятся какие-нибудь идеи, вот коммит - f8e3dad.

@dhilt
Copy link
Collaborator

dhilt commented Dec 24, 2017 via email

@dyuvzhenko
Copy link
Owner Author

@dhilt Подвижек особо не было, но в общем-то я уже начинал копаться вместе с этой таинственной переменной $implicit, по стопам следующей статьи https://teropa.info/blog/2016/03/06/writing-an-angular-2-template-directive.html. И от понимания всего там происходящего я пока что далек.

А следуя по вашему сообщению и ответу на stackoverflow все получилось, и сервис убрал.
Коммит - 8f7cea3.

@dhilt
Copy link
Collaborator

dhilt commented Dec 24, 2017 via email

@dyuvzhenko
Copy link
Owner Author

dyuvzhenko commented Dec 24, 2017

@dhilt Angular уже вроде как обновил до последней версии, вот коммит - 41094e3.
А завести UiScrollComponent уже начал пытаться завести, в процессе так сказать.

Аккаунт на stackoverflow есть, некоторое время назад мы можно сказать вместе вопрос по поводу webpack и jshint отправляли (https://stackoverflow.com/questions/47291494/how-to-jshint-two-different-folders-with-webpack). Только репутацию все еще не поднял, чтобы мои плюсики/минусики засчитывались.

@dyuvzhenko
Copy link
Owner Author

@dhilt Вернул первоначальный вид - d031a9f. Пришлось только css-стили перенести в папку ui-scroll-directive. И пока что не до конца разобрался с тем, что нужно писать в [ngTemplateOutletContext] - d031a9f#diff-371601649b2a4948697a1b03d67b2b1dR14.

@dyuvzhenko
Copy link
Owner Author

@dhilt Так, вроде теперь готово - eca3c1f.

@dyuvzhenko
Copy link
Owner Author

dyuvzhenko commented Dec 25, 2017

@dhilt Оказывается angular успел получить новую версию, обновил - 6bf7c5e.
И вроде как уже можно мержить в мастер, если не найдете никаких несостыковок.

@dhilt
Copy link
Collaborator

dhilt commented Dec 25, 2017 via email

@dhilt
Copy link
Collaborator

dhilt commented Dec 28, 2017

@khajjit Все отлично работает на данный момент. Сделай пожалуйста мерж в свой мастер и открой PR на мой мастер, я приму его. И сейчас я создам следующую задачу.

@dyuvzhenko
Copy link
Owner Author

@dhilt PR сделал - dhilt#7.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants