How To Add Infinite Scrolling to Your Angular App
アプリの構築を開始するには、まず npm i @angular/cli
を実行して Angular CLI をインストールします。 インストールした後、ng new image-gallery
を実行して、画像ギャラリー アプリ用の新しい Angular を作成します。 また、メニューの状態を保存するために Flux ストアを作成します。
次に、アプリ用のライブラリをインストールします。 npm i @angular/cdk @angular/material ng-simple-slideshow ngx-infinite-scroll @ngrx/store
を実行して、写真を表示したり、写真のスライドショーを表示したりするのに必要なライブラリをインストールします。
次に、これから記述するコードのスケルトン コードを追加します。
ng g component homePage
ng g component randomSlideshowPage
ng g component topBar
ng g class httpReqInterceptor
ng g service photo
これは、表示に使用するコンポーネントを作成するものです。 httpReqInterceptor
クラスは、すべてのリクエストのリクエスト ヘッダーに API キーをアタッチするために使用されます。 Photo serviceは、Pexels APIを呼び出すためのコードが存在します。
environment.ts
では、あなたのAPIキーを他のファイルにインポートできるようにしました。
export const environment = {
production: false,
pexelsApiKey: 'your pexels api key'
};
In http-req-interceptor.ts
, add:
This attaches our token to the Authorization
request header of every request with this block:
let modifiedReq = req.clone({});
modifiedReq = modifiedReq.clone({
setHeaders: {
'Authorization': environment.pexelsApiKey
}
});
In photo.service.ts
, put:
This lets us make the requests to the Pexels API.このブロックは、Pexels APIへのリクエストを行うためのものです。 私たちのアプリでは、ページネーション付きのキュレーションされた写真と検索のエンドポイントを使用しました。
次に、home-page.component.ts
に:
ここにあるキュレーションされた写真のエンドポイントから写真を取得し、応答の写真フィールドで map
を呼び出して画像 URL を取得します。
検索語が入力されると、ここで検索写真のエンドポイントを使用して map
関数と同じことを実行します。
home-page.component.html
には次のように記述します。
これは検索フォームを表示し、フォト グリッドを無限スクロール div
で囲んで、ユーザーが下にスクロールすると新しい画像を読み込むようにします。
infiniteScrollDistance
はページの下からのページ位置の割合で、2
はページ内の現在のコンテンツの 98% をスクロールしたときに無限スクロールがトリガーされることを意味します。
infiniteScrollThrottle
はユーザーのスクロールを停止してから無限スクロールがトリガーされるまでのミリ秒数です。 scrolled
はユーザーがページを下にスクロールしたときに発動する。
home-page.component.scss
では、以下を追加しています:
.tile-image {
width: 100%;
height: auto;
}
これは画像をグリッドボックスいっぱいに表示させます。
random-slideshow-page.component.ts
には、:
ここで、curated photos endpoint からランダムな写真を取得します。
random-photos-page.component.html
には、:
これで写真のスライドショーが表示されるようになりました。
次に、menu-reducer.ts
というファイルを作成し、メニューの状態を保存するために以下を追加します:
In reducers/index.ts
, put:
import { menuReducer } from './menu-reducer';export const reducers = {
menu: menuReducer,
};
これにより、@ngrx/store
のStoreModule
が状態の保存にメニューのリデューサを使用することができます。
app.component.ts
に、:
これにより、ページ変更時やメニューボタンをクリックしていない場合は、自動的に左側メニューが閉じられます。 メニューの状態をストアで取得し、ナビゲーションやメニュー外のクリックによってメニューを閉じる必要がある場合、メニューをオフに切り替え、ストアで状態を設定します。
top-bar.component.ts
に:
これによりメニューを切り替え、ストアで状態を保存することが可能です。
In app.component.html
, we have:
This shows the left side menu for navigation, and router-outlet
lets users see our pages when clicking on the links above or typing the URL directly.
In app.component.scss
, we add:
#content {
padding: 20px;
min-height: 130vh;
}ul {
list-style-type: none;
margin: 0;
li {
padding: 20px 5px;
}
}
This adds some padding and removed the margins on the pages.(ページ上に余白を追加する)とあるように、
in app.component.html
は、ナビゲーション用の左側メニューを表示します。
最後に、app.module.ts
に次のように入力します。
これには、すべてのライブラリ、HTTP インターセプター、およびアプリを機能させるために必要なサービスが含まれています。
最終的に、完成したアプリには次のようなものがあります。