KnockoutJS教程

KnockoutJS 组件

组件是组织 UI 代码以构建大型应用程序和促进代码可重用性的重要方式。
它是从其他组件继承或嵌套的。对于加载和配置,它定义了自己的约定或逻辑。
它被打包以在整个应用程序或项目中重复使用。代表应用程序或小控件/小部件的完整部分。可以按需加载或预加载。

组件注册

组件可以使用 ko.components.register() API 注册。它有助于加载和表示 KO 中的组件。需要注册的组件名称和配置。配置指定如何确定viewModel和模板。
语法
组件可以注册如下-
ko.components.register('component-name', {
   viewModel: {...},    //function code
   template: {....) //function code
});
component-name 可以是任何非空字符串。 viewModel 是可选的,可以采用下一节中列出的任何 viewModel 格式。 template 是必需的,可以采用下一节中列出的任何模板格式。

声明一个视图模型

下表列出了可用于注册组件的 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: ....  
});
td>
4
AMD 模块
它是一种模块格式,用于定义模块和依赖项都异步加载的模块。
ko.components.register('component name', {
   viewModel: { require: 'some/module/name' },
   template: ...
});
define(['knockout'], function(ko) {
   function MyViewModel() {
      // ...
   }
   return MyViewModel;
});

陈述模板

下表列出了可用于注册组件的模板格式。
Sr.No. 模板表单
1
元素 ID
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: ...
});

注册为单个 AMD 模块的组件

AMD 模块可以自己注册一个组件,而无需使用 viewModel/template 对。
ko.components.register('component name',{ require: 'some/module'});

组件绑定

组件绑定有两种方式。
完整语法-它将参数和对象传递给组件。它可以使用以下属性传递。 name-添加组件名称。 params-它可以在组件的对象中传递多个参数。
<div data-bind='component: {
   name: "tutorials point",
   params: { mode: "detailed-list", items: productsList }
}'>
</div>
简写语法-它将字符串作为组件名称传递,并且其中不包含参数。
<div data-bind = 'component: "component name"'></div>
仅模板组件-组件只能定义模板而不指定视图模型。
ko.components.register('component name', {
   template:'<input data-bind = "value: someName" />,
});
在没有容器元素的情况下使用组件-可以在不使用额外容器元素的情况下使用组件。这可以使用与注释标签类似的无容器流控件来完成。
<!--ko.component: ""-->
<!--/ko-->

自定义元素

自定义元素是一种呈现组件的方式。在这里,你可以直接写一个自描述的标记元素名称,而不是定义一个占位符,组件通过它来绑定。
<products-list params = "name: userName, type: userType"></products-list>

传递参数

params 属性用于将参数传递给组件视图模型。它类似于数据绑定属性。 params 属性的内容被解释为 JavaScript 对象文字(就像数据绑定属性),因此您可以传递任何类型的任意值。它可以通过以下方式传递参数-
父组件和子组件之间的通信-组件本身不会实例化,因此视图模型属性是从组件外部引用的,因此会被子组件视图模型接收。例如,您可以在以下语法中看到 ModelValue 是父视图模型,由子视图模型构造函数 ModelProperty 接收。 传递可观察的表达式-它在 params 参数中有三个值。 simpleExpression-它是一个数值。它不涉及任何可观察的。 simpleObservable-它是在父视图模型上定义的实例。父视图模型将自动获取子视图模型对可观察对象所做的更改。 observableExpression-当表达式由自身求值时,表达式读取可观察值。当 observable 值发生变化时,表达式的结果也会随时间发生变化。
我们可以传递参数如下-
<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', { ......... });
示例
<!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 文件。

组件加载器

组件加载器用于为给定的组件名称异步传递模板/视图模型对。

默认组件加载器

默认组件加载器取决于显式注册的配置。每个组件在使用组件之前都要注册。
ko.components.defaultLoader

组件加载器实用功能

默认组件加载器可以使用以下函数进行读写。
Sr.No. 实用功能和说明
1
ko.components.register(name, configuration)
组件已注册。
2
ko.components.isRegistered(name)
如果特定的组件名称已经注册,则返回真,否则返回假。
3
ko.components.unregister(name)
组件名称从注册表中删除。
4
ko.components.get(name, callback)
这个函数会轮流到每个注册的loader去寻找谁通过了viewModel/template定义对于组件名称作为第一个。然后它通过调用 callback 返回 viewModel/template 声明。如果注册的加载器找不到有关组件的任何信息,则它会调用 callback(null)
5
ko.components.clearCachedDefinition(name)
当我们想清除给定的组件缓存条目时可以调用这个函数。如果下次需要该组件,将再次咨询加载程序。

实现自定义组件加载器

自定义组件加载器可以通过以下方式实现-
getConfig(name, callback)-根据名称,我们可以以编程方式传递配置。我们可以调用 callback(componentConfig) 来传递配置,其中对象 componentConfig 可以被 loadComponent 或任何其他加载器使用。 loadComponent(name, componentConfig, callback)-此函数根据配置方式解析视图模型和配置的模板部分。我们可以调用 callback(result) 来传递 viewmodel/template 对,其中对象 result 由以下属性定义。 模板-必需。返回 DOM 节点数组。 createViewModel(params, componentInfo)-可选。根据 viewModel 属性的配置方式返回 viewModel 对象。 loadTemplate(name, templateConfig, callback)-DOM 节点使用自定义逻辑在模板中传递。对象 templateConfig 是来自对象 componentConfig 的模板的属性。调用 callback(domNodeArray) 以传递 DOM 节点数组。 loadViewModel(name, templateConfig, callback)-使用自定义逻辑在 viewModel 配置中传递 viewModel 工厂。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4