これは、変数の定義と一致する正規表現による結果を渡す、Http.get
を使用して、生のSCSSファイルをロードするサービスを作成するのはとても簡単ですが、...
しかし、正直なところ、私は考えますあなたは間違った木を吠え、デザインを再考する必要があります。 scss変数(およびそれを使用するCSSクラス)がコンパイルされ、クライアントで利用可能になっている場合は、なぜ手動でスタイルを適用したいのですか?
あなたのグリッドシステムにマップされた独自のCSSクラスを定義してからバインドするためにホストエレメントclass
へのバインディングを設定できないのはなぜですか? ngClass
が指令であるため、少し醜いので、ホスト要素にバインドすることはできませんが、実行可能です。
例として、ブートストラップcol-<sw>-<colspan>
形式を取る:
export type ScreenWidth = 'xs' | 'sm' | 'md' | 'lg';
@Directive({
selector: `div[gridColumn]`,
host: {
'[attr.class]': 'hostClasses.join(' ')'
},
changeDetection: ChangeDetectionStrategy.OnPush
})
export class GridColumn {
@Input('gridColumn') screenWidth: ScreenWidth = 'md';
@Input() colSpan: number = 1;
constructor(private _host: ElementRef) {}
get hostClasses(): Array<string> {
let existingClasses = this._host.nativeElement.classList
.filter(cls => !/^col-/.test(cls)
return [
...existingClasses,
`col-${this.screenWidth}-${colSpan}`
];
}
}
使い方は次のようになります。
<div gridColumn="xs" [colSpan]="4"></div>
正直、とにかく<div class="col-xs-4"></div>
と同じ読みやすさについてですので、なぜわざわざどちら?
ご意見ありがとうございました。私は非常に非標準のグリッドを使用しています。すべてのタイルが1x1であるわけではありません。したがって、私は、left-2やtop-3などのCSSクラスを追加して、タイル要素を適用して最適な順序で配置します。タイルの幅や余白の幅を変更することに決めた場合は、コードを複数の場所に配置することは望ましくありません。 – Spider
生のSCSSファイルもWebPack – Spider
によってバンドルされています。 私は自分自身のSCSSクラスを定義し、ディレクティブを使ってホストに動的にバインドします。 1つの場所にすべてのコードがあるだけでなく、すべてのスタイルがスタイルシートに含まれています。 また、既存のメディアクエリを適用することができます。これは、グリッドを定義するときに常に役立ちます。 – ovangle