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

[DONE] Day040 content: Custom Structural Directive #18

Open
wants to merge 16 commits into
base: master
Choose a base branch
from

Conversation

januaryofmine
Copy link
Contributor

@januaryofmine januaryofmine commented Aug 11, 2020

Work in progress. Structure for Day 40 Custom Structural Directive.

@januaryofmine januaryofmine changed the title [WIP] Day040 content Day040 content Aug 12, 2020
@januaryofmine
Copy link
Contributor Author

@tieppt @nartc @trungk18 dạ em đã xong bài 40: Custom Structural Directive. Các anh xem và review giúp em. Em cảm ơn.

@januaryofmine januaryofmine changed the title Day040 content Day040 content: Custom Structural Directive Aug 12, 2020
@trungvose
Copy link
Member

@januaryofmine Cảm ơn em nhé. Để lát anh review 🤞

@januaryofmine
Copy link
Contributor Author

Em có update 1 số content ở bài này. Các anh đọc commit mới nhất nhen. Em cảm ơn.

@januaryofmine januaryofmine changed the title Day040 content: Custom Structural Directive [DONE] Day040 content: Custom Structural Directive Aug 13, 2020
@@ -0,0 +1,275 @@
# Day 40: Custom Structural Directive trong Angular
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nartc Đại ca review day 40 nhé. Trong quãng đời 4 năm em chưa viết custom structural directive bao giờ nên nghĩ là em ko nên review bài này 😂😂

@@ -236,7 +256,7 @@ Container có thể chứa các container khác (ng-container chẳng hạn) t

Đây là 1 class nhận vào các component để load dynamic và tạo ra 1 component factory của component đó. ViewContainerRef sẽ dùng **ComponentFactory** đó để load dynamic các components.

## Exercies
## Exercise
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@januaryofmine Nếu em dùng VSCode để viết markdown thì có mấy cái extension khá hữu ích, có khi em cài rồi nhưng anh cứ note ra.

  1. https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker - Để check chính tả và spelling. Tránh lỗi như em phải sửa sai spelling như ở dòng này.

  2. https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one - Để format, tạo table of content etc cho markdown. Nhưng hình như khi turn on thì type tiếng Việt ko có được 😂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@trungk18
dạ, em cảm ơn a. v có gì a giúp em xem day 39 với day 41 với. Em cảm ơn anh.


### Step 3: Code directive logic

Chúng ta sẽ inject **ElementRef** vào constructor của directive như sau:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@januaryofmine Em có ví dụ nào thực tế hơn chút không? Vì directive này thật ra thực tế 99% là mình sẽ ko dùng đến. Nên nếu lấy đc một ví dụ nào đó em đã từng dùng thì sẽ dể để mọi người hình dung hơn. Chứ một directive để hiện lên một đoạn demo text và hover với color khác thì nếu là anh, anh sẽ viết CSS cho nhanh 😂

Đa phần custom directive anh viết thì để wrap cái element với một thư viện nào đấy chưa có sẵn cho Angular. Thì anh nghĩ đây là một use case khá phổ biến.

@Directive({ selector: "[jsTree]" })
export class JsTreeDirective implements AfterViewInit {
  @Input() jsTree: any;

  constructor(private el: ElementRef, private zone: NgZone) { 
    this.jsTree = this.jsTree || {}
  }

  ngAfterViewInit(): void {
    try {
      runOutsideAngular(this.zone, () => {
        let jsTreeElement = $(this.el.nativeElement);
        jsTreeElement.jstree(this.jsTree).bind("select_node.jstree", function (e, data) {
          var href = data.node.a_attr.href;
          if (href.indexOf('#') === -1)
            document.location.href = href;
        });
        jsTreeElement.removeClass("hidden");
      })
    } catch (error) { }
  }
}

@nartc @tieppt Các đại ca thấy sao?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dạ. Em trong quá trình research về attribute directive, em thường thấy các use-cases demo là dùng để thay đổi styling hay attributes có sẵn của thẻ. em nghĩ directive này 1 ví dụ. Trong lúc xây dựng ví dụ, em tập trung vào sự dễ hiểu, để các bạn có thể nhanh chóng grab idea và ứng dụng theo ý các bạn. Vậy nên bản thân ví dụ sẽ đơn giản, không có tính sử dụng trực tiếp nhưng sẽ có tính tham khảo để custom nhanh theo business. Ngoài ra sự khác biệt của attribute directive và css em nghĩ đó là tính reuseable. Em thấy directive sẽ reuse dễ dàng hơn.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Em cũng bám khá sát ví dụ từ official docs của Angular. Ở đây nó build 1 example tương tự thế này nè anh: https://angular.io/guide/attribute-directives

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ừ anh hiểu ý, nhưng vì mình làm series nên nếu ví dụ sát thực tế hơn tý cũng đẹp trai hơn mà. Vì nhiều ví dụ trên Angular docs anh thấy tính thực tiễn cũng hơi thấp 🤣 Anw ý kiến chủ quan của anh thôi, chứ content hiện tại cũng rất là tốt rồi nhé.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ví dụ gì mà dùng jquery thế này....

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dạ, ý của a @trungk18 là wrap thư viện lại. Còn project của em không có dùng jquery.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

một directive khá phổ biến là để truyền vào permissions, sau đó check list available rồi xem có render một template hay ko. https://github.com/AlexKhymenko/ngx-permissions

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dạ a. v giờ em sửa lại demo ha a @tieppt.

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

Successfully merging this pull request may close these issues.

4 participants