Bruno César
Bruno César

Reputation: 81

Error on duplicating html element with ng-model array

I'm having trouble duplicating a select element with angular directives and adding a new index in the array contained in ng-model.

To exemplify:

My html code

    <div class="col-sm-12">
        <div class="col-sm-6">
            <select name="perfil_cliente[]" class="form-control" required ng-model="trava.composicao['{{vm.composicaoBloco}}'].perfil_cliente">
                <option value="" selected>Selecione o perfil desejado</option>
                <option ng-value="entidadePerfil.id" ng-repeat="entidadePerfil in vm.entidadesPerfis">{{entidadePerfil.nome | uppercase}}</option>
            </select>
        </div>
        <div class="col-sm-5">
            <select name="plano[]" class="form-control" required ng-model="trava.composicao['{{vm.composicaoBloco}}'].plano">
                <option value="" selected>Selecione o plano desejado</option>
                <option ng-value="plano.id" ng-repeat="plano in vm.planos">{{plano.nome | uppercase}}</option>
            </select>
        </div>
        <div class="col-sm-1">
            <button duplicate-row type="button" class="btn btn-success pull-right" value="container-composicao-desconto" ng-init="vm.composicaoBloco = vm.composicaoBloco + 1">
                <i class="fa fa-plus" aria-hidden="true" ></i>
            </button>
        </div>
    </div>

    <div class="row-elements">
        <div class="row fix-row-padding">
            <div class="col-sm-12">
                <div class="col-sm-6">
                    <select name="perfil_usuario[]" class="form-control" required ng-model="trava.composicao['{{vm.composicaoBloco}}'].dados_trava['{{vm.composicaoLinha}}'].perfil_usuario">
                        <option value="" selected>Selecione o perfil de usuário</option>
                        <option ng-value="usuarioPerfil.id" ng-repeat="usuarioPerfil in vm.usuariosPerfis">{{usuarioPerfil.nome | uppercase}}</option>
                    </select>
                </div>
                <div class="col-sm-5">
                    <input type="number" name="valor_desconto[]" class="form-control descontos" placeholder="Valor do Desconto" required min="0" max="100" ng-model="trava.composicao['{{vm.composicaoBloco}}'].dados_trava['{{vm.composicaoLinha}}'].valor_desconto"/>
                </div>
                <div class="col-sm-1">
                    <button type="button" duplicate-row class="btn btn-success pull-right invert-controls" value="" style="padding-left: 13.5px; padding-right: 13.5px;" ng-init="vm.composicaoLinha = vm.composicaoLinha + 1">
                        <i class="fa fa-level-down" aria-hidden="true" ></i>
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>

My directive code

.directive("duplicateRow", function ($compile) {
        return {
            restrict: "A",
            link: function (scope, element, attr) {
                element.on('click', function () {

                    var row = element.closest('.row').first();
                    var linha = row.html();
                    console.log(linha);
                    if (linha.indexOf('invert-controls') !== -1) {
                        linha = linha.replace("fa-plus", "fa-minus").replace("duplicate-row", "remove-row").replace("btn-success", "btn-danger");
                    }

                    var elemento = angular.element('<div class="row fix-row-padding">' + linha + '</div>');

                    elemento.insertAfter(row);

                    $compile(elemento)(scope);
                });
            }
        }
    })

And the response that i'm receive is this one

enter image description here

The second 'composicao' key that i receive is {{vm.composicaoBloco}}. I search some questions here but still not found the answer. Can anybody help me to fix this? Or tell me what i'm doing worng!

Thanks guys"

Upvotes: 0

Views: 94

Answers (1)

Alexander Anikeev
Alexander Anikeev

Reputation: 701

Incorrect:

trava.composicao['{{vm.composicaoBloco}}']

Correct:

trava.composicao[vm.composicaoBloco]

EDIT:

Everything is done very strangely.

I would do something like this:

HTML (most likely lost some wrap tags)

<div ng-repeat-begin="composicao in trava.composicao" class="col-sm-12">
    <div class="col-sm-6">
        <select name="perfil_cliente[]" class="form-control" required ng-model="composicao.perfil_cliente">
            <option value="" selected>Selecione o perfil desejado</option>
            <option ng-value="entidadePerfil.id" ng-repeat="entidadePerfil in vm.entidadesPerfis">{{entidadePerfil.nome | uppercase}}</option>
        </select>
    </div>
    <div class="col-sm-5">
        <select name="plano[]" class="form-control" required ng-model="composicao.plano">
            <option value="" selected>Selecione o plano desejado</option>
            <option ng-value="plano.id" ng-repeat="plano in vm.planos">{{plano.nome | uppercase}}</option>
        </select>
    </div>
    <div class="col-sm-1">
        <button type="button" class="btn btn-success pull-right" value="container-composicao-desconto" ng-click="vm.addComposicao()" ng-if="$last">
            <i class="fa fa-plus" aria-hidden="true" ></i>
        </button>
        <button type="button" class="btn btn-danger pull-right" value="container-composicao-desconto" ng-click="vm.removeComposicao($index)" ng-if="!$last">
            <i class="fa fa-minus" aria-hidden="true" ></i>
        </button>
    </div>
</div>

<div ng-repeat-end class="row-elements">
    <div class="row fix-row-padding" ng-repeat="dadosTrava in composicao.dados_trava">
        <div class="col-sm-12">
            <div class="col-sm-6">
                <select name="perfil_usuario[]" class="form-control" required ng-model="dadosTrava.perfil_usuario">
                    <option value="" selected>Selecione o perfil de usuário</option>
                    <option ng-value="usuarioPerfil.id" ng-repeat="usuarioPerfil in vm.usuariosPerfis">{{usuarioPerfil.nome | uppercase}}</option>
                </select>
            </div>
            <div class="col-sm-5">
                <input type="number" name="valor_desconto[]" class="form-control descontos" placeholder="Valor do Desconto" required min="0" max="100" ng-model="dadosTrava.valor_desconto"/>
            </div>
            <div class="col-sm-1">
                <button type="button" duplicate-row class="btn btn-success pull-right invert-controls" value="" style="padding-left: 13.5px; padding-right: 13.5px;" ng-click="vm.addDadosTrava()" ng-if="$last">
                    <i class="fa fa-plus" aria-hidden="true" ></i>
                </button>
                <button type="button" duplicate-row class="btn btn-danger pull-right invert-controls" value="" style="padding-left: 13.5px; padding-right: 13.5px;" ng-click="vm.removeDadosTrava()" ng-if="$last">
                    <i class="fa fa-minus" aria-hidden="true" ></i>
                </button>
            </div>
        </div>
    </div>
</div>

Angular Controller:

vm.addComposicao = function () {
    trava.composicao.push({
        dados_trava: [{}]
    });
};

vm.removeComposicao = function (index) {
    trava.composicao.splice(index, 1);
};

vm.addDadosTrava = function (composicaoIndex) {
    if (!trava.composicao[composicaoIndex]) {
        return;
    }

    trava.composicao[composicaoIndex].dados_trava.push({});
};

vm.removeDadosTrava = function (composicaoIndex, dadosTravaIdnex) {
    trava.composicao[composicaoIndex].dados_trava.splice(dadosTravaIdnex, 1)
};

Try to think in this way.

Upvotes: 1

Related Questions