Modelo ng de ligação dentro do loop de repetição de ng em AngularJS

94

Estou tentando lidar com o problema de escopo dentro de um loop ng-repeat - já pesquisei algumas perguntas, mas não consegui fazer meu código funcionar.

Código do controlador:

function Ctrl($scope) {
  $scope.lines = [{text: 'res1'}, {text:'res2'}];
}

Visão:

<div ng-app>
     <div ng-controller="Ctrl">
       <div ng-repeat="line in lines">
           <div class="preview">{{text}}{{$index}}</div>

       </div>
       <div ng-repeat="line in lines">
           <-- typing here should auto update it's preview above -->
           <input value="{{line.text}}" ng-model="text{{$index}}"/>
            <!-- many other fields here that will also affect the preview -->
       </div>
     </div>
    </div>

Aqui está um violino: http://jsfiddle.net/cyberwombat/zqTah/

Basicamente, tenho um objeto (é um gerador de flyer) que contém várias linhas de texto. Cada linha de texto pode ser ajustada pelo usuário (texto, fonte, tamanho, cor, etc) e quero criar uma visualização para ela. O exemplo acima mostra apenas o campo de entrada para inserir texto e eu gostaria que atualizasse automaticamente / conforme você digitasse a div de visualização, mas haverá muitos mais controles.

Também não tenho certeza se obtive o código correto para o índice de loop - essa é a melhor maneira de criar um nome de modelo ng dentro do loop?

cyberwombat
fonte
1
o violino não parece funcionar ..
philx_x

Respostas:

116

Para cada iteração do loop de repetição de ng, lineé uma referência a um objeto em seu array. Portanto, para visualizar o valor, use {{line.text}}.

Da mesma forma, para vincular ao texto, vincular ao mesmo: ng-model="line.text". Você não precisa usar valueao usar o ng-model (na verdade, você não deve).

Fiddle .

Para uma análise mais aprofundada dos escopos e da repetição de ng, consulte Quais são as nuances da herança prototípica / prototípica do escopo no AngularJS? , seção ng-repeat .

Mark Rajcok
fonte
que tal o teste e2e deste código? Quero dizer, como selecionar uma entrada se o modelo for dinâmico?
devmao 01 de
1
Os itens que estão sendo iterados precisam ser objetos então? Em outras palavras, eles não podem ser primitivos, como strings, por exemplo, $ scope.lines = ['a', 'b', 'c']?
berto
2
@berto, sim, devem ser objetos. Isso é discutido na referência vinculada, "Quais são as nuances do protótipo de escopo ...".
Mark Rajcok
Eu tenho um problema semelhante de ng-repeat / ng-model. Eu fiz algumas pesquisas e acho que estou quase lá. Se alguém pudesse dar uma olhada, eu realmente apreciaria. stackoverflow.com/questions/32855575/…
user1532669
2
<h4>Order List</h4>
<ul>
    <li ng-repeat="val in filter_option.order">
        <span>
            <input title="{{filter_option.order_name[$index]}}" type="radio" ng-model="filter_param.order_option" ng-value="'{{val}}'" />
            &nbsp;{{filter_option.order_name[$index]}}
        </span>
        <select title="" ng-model="filter_param[val]">
            <option value="asc">Asc</option>
            <option value="desc">Desc</option>
        </select>
    </li>
</ul>
imdba
fonte