Команда angular имеет пакет angular / flex-layout , который я широко использую в своей кодовой базе.Я конвертирую многие из этих основных компонентов, которые также будут использоваться на мобильных устройствах через Nativescript, и с этой целью создал свой собственный компонент, имитирующий функциональность flex-layout.FlexboxLayout делает все, что мне нужно, чтобы этот компонент изначально , за исключением , обеспечивает механизм для размещения размеченных компонентов с равномерным зазором между ними.(ПРИМЕЧАНИЕ: Не пробел между ними, поскольку разрывы, возникающие из-за этого, не являются равномерными).По сути, flex-layout устанавливает правое поле, равное размеру зазора, если макет представляет собой строку, и нижнее поле, если макет представляет собой столбец.Вот мой код, чтобы попытаться сделать то же самое в Nativescript, который не работает для меня.
import { Component, ElementRef, Input, ViewChild } from "@angular/core";
import { FlexboxLayout } from "tns-core-modules/ui/layouts/flexbox-layout";
import { View } from "tns-core-modules/ui/core/view/view";
@Component({
selector: "flex-layout",
template: `
<FlexboxLayout
#flexbox
[flexDirection]="layout"
[flexWrap]="wrap"
[justifyContent]="justify"
[alignItems]="align"
[ngStyle]="{ width: width, height: height }"
>
<ng-content></ng-content>
</FlexboxLayout>
`
})
export class FlexLayoutComponent {
@Input() layout: string = "row";
@Input() wrap: string;
@Input() justify: string;
@Input() align: string = "start";
@Input() gap: number;
@Input() width: number;
@Input() height: number;
@ViewChild("flexbox") flexboxEl: ElementRef;
ngAfterContentInit() {
let flexbox: FlexboxLayout = <FlexboxLayout>(
this.flexboxEl.nativeElement
);
if (this.gap) {
flexbox.eachChildView((child: View) => {
if (this.layout === "row") {
child.marginRight = this.gap;
} else {
child.marginBottom = this.gap;
}
return true;
});
}
}
}
Установка поля, как это, похоже, не влияет на компоненты.
ЕщеПриветственное решение - это то, в котором мне вообще не нужно создавать этот компонент.То есть я упускаю какой-то очевидный тип / параметр макета, который бы уже сделал это для меня?
ОБНОВЛЕНИЕ
Я обнаружил, что проблема ограничена дочерними объектами, которые являются ProxyViewContainers, а затем установкойполе не работает.Установка полей на родных компонентах работает нормально.Но первое - это то, что почти во всех моих случаях, так как я создаю многоцелевые (web и nativescript) компоненты.Пользовательские угловые компоненты отображаются как ProxyViewContaners, и настройка поля, кажется, не работает на них. Вот игровая площадка демонстрирующая это.Нативные компоненты получают свои поля, а ProxyViewContainers - нет.Проверка внуков этих ProxyViewContainers не является решением, потому что а) может быть более одного дочернего элемента, и я хочу, чтобы к родительскому элементу применялось только одно поле, и б) даже если это один компонент, он также, скорее всего, будетсам ProxyViewContainer!
ОБНОВЛЕНИЕ 2
Похоже, что в настоящее время это невозможно.Вы не можете напрямую стилизовать пользовательские компоненты в nativescript-angular.Я только что обнаружил нерешенную проблему , которая, я думаю, точно решит мою проблему здесь.
ОБНОВЛЕНИЕ 3
У меня есть то, что, надеюсь, пока будет исправлено.Я проверил его на игровой площадке, указанной выше, и он работает для этого простого случая.Обходной путь происходит как от проблемы, упомянутой в обновлении 2, так и от эта закрытая проблема тоже .Спасибо этим программистам за помощь.По сути, это включает в себя регистрацию элемента пользовательского компонента (через его селектор) для использования StackLayout (или любого макета, который вы хотите).Это сделано глобально, так что вы можете поместить его в модуль, где вы объявляете этот компонент, или, я думаю, в верхней части кода каждого компонента?например,
import { registerElement } from "nativescript-angular/element-registry";
import { StackLayout } from "tns-core-modules/ui/layouts/stack-layout";
registerElement('my-component-selector', () => StackLayout);
Сделайте это для всех пользовательских компонентов, которые вы хотите иметь возможность стилизовать.