javascript – Knockoutjs:从子组件调用父组件的功能

前端之家收集整理的这篇文章主要介绍了javascript – Knockoutjs:从子组件调用父组件的功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题:
我正在尝试构建一个小部件仪表板.每个小部件的标题上都有一个删除按钮.单击此按钮时,相应的小部件必须消失.

我的设计方式:
我有两个淘汰组件.

> my-widget-list:
VO将有一个observableArray的widget对象.
>我的小部件:
VO将在窗口小部件中显示详细信息.

注意:为简单起见,我只用数字替换widget对象.

  1. ko.components.register('my-widget-list',{
  2. viewmodel : function(params) {
  3. var self = this;
  4. self.values = ko.observableArray([10,20,30,40,50]);
  5.  
  6. self.deleteWidget = function(obj)
  7. {
  8. self.values.remove(obj);
  9. }
  10. },template: {element: 'my-widget-list-template'}
  11. });
  12.  
  13. ko.components.register('my-widget',{
  14. viewmodel : function(params) {
  15. var self = this;
  16. self.value = params.value;
  17. },template: {element: 'my-widget-template'}
  18. });
  19.  
  20. ko.applyBindings({});
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
  2.  
  3. <my-widget-list></my-widget-list>
  4.  
  5. <script id="my-widget-list-template" type="text/html">
  6. <div data-bind="foreach:values">
  7. <my-widget params="value: $data"></my-widget><br>
  8. </div>
  9. </script>
  10.  
  11. <script id="my-widget-template" type="text/html">
  12. <span data-bind="text: value"></span>
  13. <button data-bind="click: $parent.deleteWidget">Delete</button>
  14. </script>

现在,我想在单击按钮时调用my-widget-list的deleteWidget函数.

我想过

>将父视图模型引用传递给子项
>将子组件的params属性中的父函数作为回调传递

但我希望从专家那里知道实现这一目标的最佳方法.

JsFiddle Link

提前致谢

解决方法

您可以将父项作为参数传递给子项:
  1. ko.components.register('my-widget-list',50]);
  2.  
  3. self.deleteWidget = function(obj) {
  4. self.values.remove(obj);
  5. }
  6. },{
  7. viewmodel : function(params) {
  8. var self = this;
  9.  
  10. self.value = params.value;
  11. self.remove = function () {
  12. params.parent.deleteWidget(self.value);
  13. };
  14. },template: {element: 'my-widget-template'}
  15. });
  16.  
  17. ko.applyBindings({});
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
  2.  
  3. <my-widget-list></my-widget-list>
  4.  
  5. <script id="my-widget-list-template" type="text/html">
  6. <div data-bind="foreach:values">
  7. <my-widget params="value: $data,parent: $parent"></my-widget><br>
  8. </div>
  9. </script>
  10.  
  11. <script id="my-widget-template" type="text/html">
  12. <span data-bind="text: value"></span>
  13. <button data-bind="click: remove">Delete</button>
  14. </script>

但我不确定这是不是一个好主意,因为它不必要地将孩子与父母联系在一起.

我建议在父级中实现“删除”按钮,即在< my-widget-list>中,这样小部件可以在没有小部件列表的情况下存在(或者以不同结构的方式存在),而小部件列表是控制其子女.

比较窗口管理器:它们以相同的方式工作.窗口管理器绘制框架和最小化/最大化/关闭按钮,而窗口内容由相应的子进程绘制.这种逻辑在你的场景中也是有意义的.

父级中使用removeWidget控件的替代实现:

  1. ko.components.register('my-widget-list',{
  2. viewmodel : function(params) {
  3. var self = this;
  4.  
  5. self.values = ko.observableArray([10,{
  6. viewmodel : function(params) {
  7. var self = this;
  8.  
  9. self.value = params.value;
  10. },template: {element: 'my-widget-template'}
  11. });
  12.  
  13. ko.applyBindings({});
  1. .widget-container {
  2. position: relative;
  3. display: inline-block;
  4. padding: 10px 5px 5px 5px;
  5. margin: 0 5px 5px 0;
  6. border: 1px solid silver;
  7. border-radius: 2px;
  8. min-width: 40px;
  9. }
  10. .widget-buttons {
  11. position: absolute;
  12. top: 2px;
  13. right: 2px;
  14. }
  15. .widget-buttons > button {
  16. font-size: 2px;
  17. padding: 0;
  18. height: 15px;
  19. width: 15px;
  20. }
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
  2.  
  3. <my-widget-list></my-widget-list>
  4.  
  5. <script id="my-widget-list-template" type="text/html">
  6. <div class="widget-list" data-bind="foreach:values">
  7. <div class="widget-container">
  8. <div class="widget-buttons">
  9. <button data-bind="click: $parent.deleteWidget">X</button>
  10. </div>
  11. <my-widget params="value: $data"></my-widget>
  12. </div>
  13. </div>
  14. </script>
  15.  
  16. <script id="my-widget-template" type="text/html">
  17. <div class="widget">
  18. <span data-bind="text: value"></span>
  19. </div>
  20. </script>

猜你在找的JavaScript相关文章