Я не могу передать массив динамических строк в компонент без использования java-скрипта.

Пример: values="{!v.foo + ',bar'}". В этом примере (ожидаемый) массив, кажется, передается как строка. Я бы предпочел передать такие значения, как {![v.foo, 'bar']}, но это не позволит мне сохранить.

неожиданный токен: левая квадратная скобка в столбце 1

Итак, есть ли способ сгенерировать этот массив без использования контроллера? это сделало бы мой компонент более читабельным.

мое.приложение

<aura:application >
    <aura:attribute name="foo" type="String" default="foo" />

    <c:fooBar values="{!v.foo + ',bar'}" />
</aura:application>

fooBar.cmp

<aura:component >
    <aura:attribute name="values" type="String[]" />

    <aura:handler name="init" value="{!this}" action="{!c.init}" />
</aura:component>

Тип журнала значений

({
    init: function(cmp, event, helper) {
        console.log(typeof cmp.get("v.values"));
       // output: string
    }
})
2
Basti 22 Янв 2019 в 13:03

3 ответа

Лучший ответ

Спасибо за ваш отзыв. Кажется, что без js это невозможно решить, поэтому я решил исправить это в центральной точке моего компонента fooBar.

Итак, поскольку я знаю, что мой динамический ввод всегда будет содержать список, разделенный запятыми, я решил преобразовать его после передачи, что делает вызов моих компонентов читабельным и бесплатным js. (В этом примере используется поставщик значений, чтобы указать, почему так чище)

<aura:application >
    <c:X context="{!this}" /> // value Provider

    <c:fooBar values="{!X.foo + ',' + X.bar + ',' + X.more}" />
    <c:fooBar values="{!X.foo + ',' + X.more}" />
</aura:application>

<aura:component >
    <aura:attribute name="values" type="String" />
    <aura:attribute name="casted" type="String[]" />

    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
</aura:component>


({
    doInit : function(cmp, event, helper) {
        cmp.set("v.casted", cmp.get("v.values").split(','));
        console.table(cmp.get("v.casted"));
    }
})
0
Basti 22 Янв 2019 в 15:11

Почему вы не хотите использовать Lightning Controller. Я не думаю, что вы справитесь с этим без JS, так как компилятор не позволит вам его сохранить (это также ваше текущее поведение).

Я предлагаю вам создать массив в JS и использовать его.

<aura:application >
    <aura:attribute name="foo" type="String" default="foo" />
    <aura:attribute name="values" type="String[]" default="[]"/>
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
    <c:fooBar values="{!v.values}" />
</aura:application>

И JS

({
    doInit : function(cmp, event, helper) {
        var valueArr = [];
        valueArr.push('StaticValue');
        valueArr.push(cmp.get("v.DynamicValue"));
        cmp.set("v.values", valueArr);
       // output: string
    }
})
3
Tushar Sharma 22 Янв 2019 в 13:52
1
Спасибо за ваш ответ, и беру галстук, чтобы ответить на него! Я решил сделать это наоборот, чтобы преодолеть избыточные js всякий раз, когда я вызываю свой компонент (см. мой ответ).
 – 
Basti
22 Янв 2019 в 15:13
Рад узнать, что вы можете решить это по-другому.
 – 
Tushar Sharma
22 Янв 2019 в 16:07

Вы пытались объявить тип атрибута foo для String[] в приложении Lightning? Я имею в виду, как показано ниже.

<aura:application >
<aura:attribute name="foo" type="String[]" default="foo" />
<c:fooBar values="{!v.foo + ',bar'}" />
0
Mukesh Yadav 22 Янв 2019 в 13:57
Это не помогает, и я не вижу, как это могло бы быть.
 – 
Basti
22 Янв 2019 в 14:41