Учебники

KnockoutJS — Компоненты

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

Он наследуется или вкладывается от другого компонента. Для загрузки и настройки он определяет свои собственные соглашения или логику.

Он упакован для повторного использования в приложении или проекте. Представляет полные разделы приложения или небольшие элементы управления / виджеты. Он может быть загружен или предварительно загружен по требованию.

Регистрация компонентов

Компоненты могут зарегистрироваться с помощью API ko.components.register () . Это помогает загружать и представлять компоненты в KO. Имя компонента с конфигурацией ожидается для регистрации. Конфигурация определяет, как определить viewModel и шаблон.

Синтаксис

Компоненты могут быть зарегистрированы следующим образом —

ko.components.register('component-name', {
   viewModel: {...},    //function code
   template: {....)	//function code
});
  • Имя компонента может быть любой непустой строкой.

  • viewModel является необязательным и может принимать любой из форматов viewModel, перечисленных в следующих разделах.

  • Шаблон обязателен и может принимать любой из форматов шаблонов, перечисленных в следующих разделах.

Имя компонента может быть любой непустой строкой.

viewModel является необязательным и может принимать любой из форматов viewModel, перечисленных в следующих разделах.

Шаблон обязателен и может принимать любой из форматов шаблонов, перечисленных в следующих разделах.

Заявление модели представления

В следующей таблице перечислены форматы viewModel, которые можно использовать для регистрации компонентов.

Sr.No. viewModel Формы и описание
1

функция конструктора

Он создает отдельный объект viewModel для каждого компонента. Объект или функция используется для привязки в представлении компонентов.

function SomeComponentViewModel(params) {
   this.someProperty = params.something;
}
ko.components.register('component name', {
   viewModel: SomeComponentViewModel,
   template: ...
});
2

экземпляр общего объекта

Экземпляр объекта viewModel является общим. Свойство экземпляра передается для непосредственного использования объекта.

var sharedViewModelInstance = { ... };

ko.components.register('component name', {
   viewModel: { instance: sharedViewModelInstance },
   template: ...
});
3

createViewModel

Он вызывает функцию, которая действует как фабрика и может использоваться как модель представления, которая может возвращать объект.

ko.components.register('component name', {  
   viewModel: {  
      createViewModel: function (params, componentInfo) {  
         ...       //function code  
         ...
      }  
   },  
   template: ....  
});
4

Модуль AMD

Это формат модуля для определения модулей, где модуль и зависимости загружаются асинхронно.

ko.components.register('component name', {
   viewModel: { require: 'some/module/name' },
   template: ...
});

define(['knockout'], function(ko) {
   function MyViewModel() {
      // ...
   }

   return MyViewModel;
});

функция конструктора

Он создает отдельный объект viewModel для каждого компонента. Объект или функция используется для привязки в представлении компонентов.

экземпляр общего объекта

Экземпляр объекта viewModel является общим. Свойство экземпляра передается для непосредственного использования объекта.

createViewModel

Он вызывает функцию, которая действует как фабрика и может использоваться как модель представления, которая может возвращать объект.

Модуль AMD

Это формат модуля для определения модулей, где модуль и зависимости загружаются асинхронно.

Заявление шаблона

В следующей таблице перечислены форматы шаблонов, которые можно использовать для регистрации компонентов.

Sr.No. Шаблоны форм
1

идентификатор элемента

ko.components.register('component name', {
   template: { element: 'component-template' },
   viewModel: ...
});
2

экземпляр элемента

var elemInstance = document.getElementById('component-template');

ko.components.register('component name', {
   template: { element: elemInstance },
   viewModel: ...
});
3

строка разметки

ko.components.register('component name', {
   template: '<input data-bind = "value: yourName" />\
      <button data-bind = "click: addEmp">Add Emp </button>',
   viewModel: ...
});
4

DOM-узлы

var emp = [
   document.getElementById('node 1'),
   document.getElementById('node 2'),
];

ko.components.register('component name', {
   template: emp,
   viewModel: ...
});
5

подделка документов

ko.components.register('component name', {
   template: someDocumentFragmentInstance,
   viewModel: ...
});
6

Модуль AMD

ko.components.register('component name', {
   template: { require: 'some/template' },
   viewModel: ...
});

идентификатор элемента

экземпляр элемента

строка разметки

DOM-узлы

подделка документов

Модуль AMD

Компоненты, зарегистрированные как один модуль AMD

Модуль AMD может зарегистрировать компонент самостоятельно, не используя пару viewModel / template.

ko.components.register('component name',{ require: 'some/module'});

Связывание компонентов

Существует два способа связывания компонентов.

  • Полный синтаксис — передает параметр и объект компоненту. Это может пройти, используя следующие свойства.

    • name — добавляет имя компонента.

    • params — может передавать несколько параметров в объекте компонента.

Полный синтаксис — передает параметр и объект компоненту. Это может пройти, используя следующие свойства.

name — добавляет имя компонента.

params — может передавать несколько параметров в объекте компонента.

<div data-bind='component: {
   name: "tutorials point",
   params: { mode: "detailed-list", items: productsList }
}'>
</div>
  • Сокращенный синтаксис — передает строку как имя компонента и не включает в себя параметр.

Сокращенный синтаксис — передает строку как имя компонента и не включает в себя параметр.

<div data-bind = 'component: "component name"'></div>
  • Компоненты только для шаблона — Компоненты могут определять только шаблон без указания viewModel.

Компоненты только для шаблона — Компоненты могут определять только шаблон без указания viewModel.

ko.components.register('component name', {
   template:'<input data-bind = "value: someName" />,
});
  • Использование компонента без элемента контейнера — компоненты могут использоваться без использования дополнительного элемента контейнера. Это можно сделать с помощью управления потоком без контейнера, которое похоже на тег комментария.

Использование компонента без элемента контейнера — компоненты могут использоваться без использования дополнительного элемента контейнера. Это можно сделать с помощью управления потоком без контейнера, которое похоже на тег комментария.

<!--ko.component: ""-->
<!--/ko-->

Таможенный элемент

Пользовательский элемент — это способ визуализации компонента. Здесь вы можете непосредственно написать самоописательное имя элемента разметки вместо определения заполнителя, где компоненты связаны через него.

<products-list params = "name: userName, type: userType"></products-list>

Передача параметра

Атрибут params используется для передачи параметра компоненту viewModel. Это похоже на атрибут привязки данных. Содержимое атрибута params интерпретируется как литерал объекта JavaScript (так же, как атрибут привязки данных), поэтому вы можете передавать произвольные значения любого типа. Он может передать параметр следующими способами —

  • Связь между родительским и дочерним компонентами — компонент не создается сам по себе, поэтому свойства viewmodel ссылаются извне компонента и, таким образом, будут получены дочерним компонентом viewmodel. Например, в следующем синтаксисе вы можете видеть, что ModelValue является родительской моделью представления, которая принимается дочерним конструктором viewModel ModelProperty .

  • Передача наблюдаемых выражений — имеет три значения в параметре params.

    • simpleExpression — это числовое значение. Это не связано с какими-либо наблюдаемыми.

    • simpleObservable — это экземпляр, который определен в родительском viewModel. Родительский viewModel автоматически получит изменения в observable, сделанные дочерним viewModel.

    • observableExpression — выражение считывает наблюдаемое, когда выражение оценивается само по себе. Когда наблюдаемое значение изменяется, то результат выражения также может меняться со временем.

Связь между родительским и дочерним компонентами — компонент не создается сам по себе, поэтому свойства viewmodel ссылаются извне компонента и, таким образом, будут получены дочерним компонентом viewmodel. Например, в следующем синтаксисе вы можете видеть, что ModelValue является родительской моделью представления, которая принимается дочерним конструктором viewModel ModelProperty .

Передача наблюдаемых выражений — имеет три значения в параметре params.

simpleExpression — это числовое значение. Это не связано с какими-либо наблюдаемыми.

simpleObservable — это экземпляр, который определен в родительском viewModel. Родительский viewModel автоматически получит изменения в observable, сделанные дочерним viewModel.

observableExpression — выражение считывает наблюдаемое, когда выражение оценивается само по себе. Когда наблюдаемое значение изменяется, то результат выражения также может меняться со временем.

Мы можем передать параметры следующим образом —

<some-component
   params = 'simpleExpression: 1 + 1,
      simpleObservable: myObservable,
      observableExpression: myObservable() + 1'>
</some-component>

Мы можем передать параметры в viewModel следующим образом:

<some-component
   params = 'objectValue:{a: 3, b: 2},
      dateValue: new date(),
      stringValue: "Hi",
      numericValue:123,
      boolValue: true/false,
      ModelProperty: ModelValue'>
</some-component>

Передача разметки в компоненты

Полученная разметка используется для создания компонента и выбирается как часть выходных данных. Следующие узлы передаются как часть вывода в шаблоне компонента.

template: { nodes: $componentTemplateNodes }

Управление именами пользовательских элементов тега

Имена, которые вы регистрируете в компонентах, используя ko.components.register , то же имя соответствует именам тегов пользовательских элементов. Мы можем изменить имена тегов пользовательских элементов, переопределив их для управления с помощью getComponentNameForNode .

ko.components.getComponentNameForNode = function(node) {
   ...
   ...   //function code
   ...
}

Регистрация пользовательских элементов

Пользовательские элементы можно сделать доступными немедленно, если используется загрузчик компонента по умолчанию и, следовательно, компонент зарегистрирован с помощью ko.components.register . Если мы не используем ko.components.register и не реализуем пользовательский загрузчик компонентов, то пользовательский элемент можно использовать, определяя любое имя по выбору. При использовании ko.components.register указывать конфигурацию не нужно, поскольку загрузчик пользовательских компонентов больше не использует ее.

ko.components.register('custom-element', { ......... });

пример

Live Demo

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Components</title>
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
   </head>
   
   <body>
      <!--params attribute is used to pass the parameter to component viewModel.-->
      <click params = "a: a, b: b"></click>

      <!--template is used for a component by specifying its ID -->
      <template id = "click-l">
         <div data-bind = "text: a"></div>

         <!--Use data-bind attribute to bind click:function() to ViewModel. -->
         <button data-bind = "click:function(){callback(1)}">Increase</button>
         <button data-bind = "click:function(){callback(-1)}">Decrease</button>
      </template>

      <script>
         //Here components are registered
         ko.components.register('click', {
            
            viewModel: function(params) {
               self = this;
               this.a = params.a;
               this.b = params.b;

               this.callback = function(num) {
                  self.b(parseInt(num));
                  self.a( self.a() + parseInt(num) );
               };
            },
            template: { element: 'click-l' }
         });

         //keeps an eye on variable for any modification in data
         function viewModel() {
            this.a = ko.observable(2);
            this.b = ko.observable(0);
         }

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

Выход

Давайте выполним следующие шаги, чтобы увидеть, как работает приведенный выше код —

  • Сохраните приведенный выше код в файле component_register.htm .

  • Откройте этот файл HTML в браузере.

Сохраните приведенный выше код в файле component_register.htm .

Откройте этот файл HTML в браузере.

Загрузчики компонентов

Загрузчики компонентов используются для асинхронной передачи пары template / viewModel для данного имени компонента.

Загрузчик компонентов по умолчанию

Загрузчик компонентов по умолчанию зависит от явно зарегистрированной конфигурации. Каждый компонент регистрируется перед использованием компонента.

ko.components.defaultLoader

Функции утилиты загрузчика компонентов

Загрузчик компонентов по умолчанию может читать и писать, используя следующие функции.

Sr.No. Сервисные функции и описание
1

ko.components.register (имя, конфигурация)

Компонент зарегистрирован.

2

ko.components.isRegistered (имя)

Если имя конкретного компонента уже зарегистрировано, оно возвращается как true, иначе false.

3

ko.components.unregister (имя)

Имя компонента удаляется из реестра.

4

ko.components.get (имя, обратный вызов)

Эта функция по очереди обращается к каждому зарегистрированному загрузчику, чтобы найти, кто первым прошел определение viewModel / template для имени компонента. Затем он возвращает представление viewModel / template, вызывая обратный вызов . Если зарегистрированный загрузчик не может найти что-либо о компоненте, он вызывает обратный вызов (ноль) .

5

ko.components.clearCachedDefinition (имя)

Эта функция может быть вызвана, когда мы хотим очистить заданную запись кэша компонента. Если компонент понадобится в следующий раз, снова будут проведены консультации с загрузчиками.

ko.components.register (имя, конфигурация)

Компонент зарегистрирован.

ko.components.isRegistered (имя)

Если имя конкретного компонента уже зарегистрировано, оно возвращается как true, иначе false.

ko.components.unregister (имя)

Имя компонента удаляется из реестра.

ko.components.get (имя, обратный вызов)

Эта функция по очереди обращается к каждому зарегистрированному загрузчику, чтобы найти, кто первым прошел определение viewModel / template для имени компонента. Затем он возвращает представление viewModel / template, вызывая обратный вызов . Если зарегистрированный загрузчик не может найти что-либо о компоненте, он вызывает обратный вызов (ноль) .

ko.components.clearCachedDefinition (имя)

Эта функция может быть вызвана, когда мы хотим очистить заданную запись кэша компонента. Если компонент понадобится в следующий раз, снова будут проведены консультации с загрузчиками.

Реализация пользовательского загрузчика компонентов

Пользовательский загрузчик компонентов может быть реализован следующими способами:

getConfig (name, callback) — в зависимости от имен мы можем передавать конфигурации программно. Мы можем вызвать callback (componentConfig) для передачи конфигураций, где объект componentConfig может использоваться loadComponent или любым другим загрузчиком.

loadComponent (name, componentConfig, callback) — эта функция разрешает viewModel и часть шаблона config в зависимости от того, как она настроена. Мы можем вызвать callback (result) для передачи пары viewmodel / template, где результат объекта определяется следующими свойствами.

Шаблон — Обязательный. Возвращает массив узлов DOM.

createViewModel (params, componentInfo) — Необязательно. Возвращает объект viewModel в зависимости от того, как было настроено свойство viewModel.

loadTemplate (name, templateConfig, callback) — узлы DOM передаются в шаблоне с использованием пользовательской логики. Объект templateConfig является свойством шаблона от объекта componentConfig. обратный вызов (domNodeArray) вызывается для передачи массива узлов DOM.

loadViewModel (name, templateConfig, callback) — фабрика viewModel передается в конфигурации viewModel с использованием пользовательской логики.