KnockoutJS - vinculação de componente

Essa ligação é usada para inserir um componente em elementos DOM e passar os parâmetros opcionalmente. Essa ligação pode ser obtida das duas maneiras a seguir -

  • Sintaxe abreviada
  • Sintaxe completa

Sintaxe abreviada

Nesta abordagem, apenas o nome do componente é especificado sem especificar nenhum parâmetro.

Syntax

<div data-bind = 'component: "component-name"'></div>

O valor do parâmetro passado pode ser observável. Portanto, sempre que o observável mudar, a instância do componente antigo será descartada e a nova será criada de acordo com o valor do parâmetro atualizado.

Sintaxe completa

Essa abordagem aceita o parâmetro na forma de um objeto.

Syntax

<div data-bind = 'component: {
   name: "component-name",
   params: { param1: value1, param2:value2 ...}
}'></div>

O objeto é composto pelos dois itens a seguir -

  • name- Este é o nome do componente a ser inserido. Como mencionado anteriormente, isso pode ser observável.

  • params- Este é um objeto a ser passado para o componente. Geralmente, este será um objeto de valor-chave incluindo vários parâmetros. Na maioria das vezes, é recebido pelo construtor de um ViewModel.

Fluxo de Trabalho de Processamento de Componente

O diagrama a seguir explica o processo que ocorre quando um componente é injetado por vinculação de componente.

Vejamos o processo em detalhes -

Receive ViewModel factory and template from component loaders- O ViewModel e o modelo registrados são solicitados e recebidos pelo carregador padrão. Por padrão, este é um processo assíncrono.

Clone the component template- Nesta etapa, ocorre a clonagem do template de componente e sua inserção no elemento DOM. O conteúdo existente, se houver, será removido.

Instantiate a ViewModel if any- Nesta etapa, ViewModel é instanciado. Se ViewModel for fornecido como uma função construtora, então o KO chama.

new ViewModelName(params)

Se ViewModel for fornecido no formato de função de fábrica, ou seja, createViewModel, então KO chama.

createViewModel(params, yourcomponentInfo)

Aqui, yourcomponentInfo.element é o elemento onde o modelo é inserido.

Bind ViewModel to view- Neste estágio, ViewModel é vinculado a View. Se ViewModel não for fornecido, a vinculação será feita com os parâmetros mencionados na vinculação do componente.

Now component is ready- Nesta fase, o componente está pronto e em funcionamento. O componente fica de olho nos parâmetros observáveis, se houver, de modo a gravar os valores alterados.

Dispose the ViewModel if the component is lost- A função dispose do ViewModel é chamada, se o valor do nome da associação do componente for alterado de forma observável ou alguma associação do fluxo de controle remover o próprio contêiner do elemento DOM, que deveria conter a saída do componente. O descarte ocorre antes de qualquer recipiente de elemento ser removido do DOM.

Example

Vamos dar uma olhada no exemplo a seguir, que demonstra o uso da vinculação de componentes.

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Component binding</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
   </head>
   
   <body>
      <h4>Component binding without parameters</h4>
      <div data-bind = 'component: "calculate-sum"'></div>

      <h4>Component binding passing parameters</h4>
      <div data-bind = 'component: {
         name: "calculate-sum",
         params: { number1: 2, number2: 3 }
      }'></div>

      <script>
         ko.components.register('calculate-sum', {
            
            viewModel: function(params) {
               this.number1 = ko.observable(params && params.number1);
               this.number2 = ko.observable(params && params.number2);

               this.result = ko.computed(function() {
                  var sum = Number(this.number1()) + Number(this.number2());
                  if ( isNaN(sum) )
                  sum = 0;
                  return sum;
               },this);
            },
            
            template: 'Enter Number One: <input data-bind = "value: number1" /> <br> <br>'+
               ' Enter Number Two: <input data-bind = "value: number2" /> <br> <br>'+
               ' Sum  = <span data-bind = "text: result" />'
         });

         ko.applyBindings();
      </script>
      
   </body>
</html>

Output

Vamos realizar as seguintes etapas para ver como funciona o código acima -

  • Salve o código acima em component-bind.htm Arquivo.

  • Abra este arquivo HTML em um navegador.

  • Insira os números em ambas as caixas de texto e observe que a soma é calculada.

Observações

Componentes apenas de modelo

Os componentes podem ser criados sem ViewModel. O componente pode incluir apenas um modelo mostrado a seguir.

ko.components.register('my-component', {
   template: '<div data-bind = "text: productName"></div>'
});

E o DOM será semelhante a -

<div data-bind = 'component: {
   name: "my-component",
   params: { productName: someProduct.name }
}'></div>

Usando vinculação de componente sem elemento de contêiner DOM

Pode haver uma situação em que não seja possível inserir um componente no elemento DOM. A vinculação essencial ainda pode ser executada com a ajuda da sintaxe sem contêiner com base nas tags de comentário mostradas a seguir.

O <! - ko -> e <! - / ko -> funcionam como marcadores de início e fim, tornando-se uma sintaxe virtual e vinculando os dados como se fossem um contêiner real.

Gerenciamento e descarte de memória

A função de descarte pode ser adicionada opcionalmente como parte do ViewModel. Se esta função estiver incluída, ela será chamada sempre que o componente for perdido ou o próprio elemento do contêiner for removido. É uma boa prática usar a função dispor para liberar recursos ocupados por objetos indesejados, que não podem ser coletados como lixo por padrão. A seguir estão alguns exemplos -

  • O método setInterval continuará em execução até que seja explicitamente limpo. clearInterval (handle) é usado para interromper este processo.

  • As propriedades do ko.computadas precisam ser eliminadas explicitamente. Caso contrário, eles ainda podem continuar recebendo notificações de seus observáveis ​​subjacentes. O descarte manual pode ser evitado usando funções puramente computadas.

  • Certifique-se de usar o método dispose () na assinatura, caso contrário, ele continua disparando as alterações até ser descartado.

  • Os manipuladores de eventos personalizados criados em elementos DOM e criados dentro de createViewModel precisam ser descartados.