Knockoutjs Component问题汇总

在使用KnockoutJs Component组件时,遇到的坑,让人晕头转向奶奶的,什么问题写的都没错啊!

1、Component绑定时,params:的参数应绑定属性引用不能绑定属性的值。

1)主页面、Component页面代码

1 <h1>主页面</h1>
2 <span>名称:</span><span data-bind="text:Name"></span><br />
3 <span>年龄:</span><span data-bind="text:age"></span><br />
4 <button data-bind="click:function(){eventClick()}">调用Component方法</button>
5 <h1>Component</h1>
6 <div class="row" data-bind="component:{name:‘mycomponent‘,params:{name:Name(),age:age(),loadData:function(fun){ReLoadComponent=fun;}}}">
7
8 </div>

1 <span>名称:</span><span data-bind="text:MyName"></span><br />
2 <span>年龄:</span><span data-bind="text:MyAge"></span><br />

2)主页面Js代码,ComponentJs代码

 1     function MainViewModel() {
 2     self.Name = ko.observable("名称");
 3     self.age = ko.observable(12);
 4     self.eventClick= function() {
 5         self.age(123);
 6         self.ReLoadComponent();
 7     }
 8     self.ReLoadComponent = function() {
 9
10     };
11 }
12
13     $(function () {
14         ko.applyBindings(new MainViewModel());
15     });

 1 //注册knockout控件
 2 ko.RegisterControl = function (controlName, viewModel, templateUrl) {
 3     if (!ko.components.isRegistered(controlName)) {
 4         ko.components.register(controlName, {
 5             viewModel: viewModel,
 6             template: (function () {
 7                 var html = ‘‘;
 8                 $.ajax({
 9                     url: templateUrl, data: {},
10                     type: ‘get‘,
11                     async: false,
12                     dataType: ‘html‘,
13                     success: function (result) {
14                         html = result;
15                     },
16                     error: function () {
17                     }
18                 });
19                 return html;
20             })()
21         });
22     } else {
23         if (window.console) {
24             window.console.log("controlname [" + controlName + "] is registered.");
25         }
26     }
27 }
28 //我的组件
29 //params
30 //name 名称,
31 //age 年龄
32
33 function MyComponentViewModel(params) {
34     //#region 属性/变量
35     var self = this;
36     self.MyName = ko.observable("");
37     self.MyAge = ko.observable(0);
38
39     function fnLoadData() {//重新加载页面 外部调用
40         self.MyName(params.name +"、年龄"+ params.age);//修改名称
41     }
42
43     //#endregion  属性/变量
44     //#region 初始化
45     self.Init = function () {
46         params.loadData(fnLoadData);
47         self.MyName(params.name);
48         self.MyAge(params.age);
49     }
50     //#endregion
51     //viewModel初始化
52     self.Init();
53 }
54 ko.RegisterControl("mycomponent", MyComponentViewModel, "/UserControls/MyComponentControl/MyComponentView.html?t=".url() + new Date().getTime());

点击“调用Component方法”的按钮的时候如下

此时Component中的名称应为“名称、年龄123”

这时再次点击“调用Component方法”的按钮的时候如下

发现第二次点击界面显示为我们预期结果。

这时调试代码,发现Component的Js代码初始化两次

问题原因:我们绑定到Component的age属性在点击“按钮”的时候对其修改了数值,这时Component认为是一个新数据,所以进行重新初始化Component

正确的绑定方式是“当绑定的数据需要变化的时候,应把这个属性的对象作为params参数,而不是将这个属性的值作为params参数”

修改后代码如下

时间: 2024-10-17 21:30:20

Knockoutjs Component问题汇总的相关文章

knockoutjs如何动态加载外部的file作为component中的template数据源

玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmodel和template, 比如下面这样: ko.components.register('message-editor', { viewModel: function(){}, template:"" }); 很显然,viewmodel就是function函数区,而template就是模板区,然后通过register函数将component注册到k

Knockoutjs:Component and Custom Elements(翻译文章)

Knockoutjs 的Components 是一种自定义的组件,它以一种强大.简介的方式将你自己的ui代码组织成一种单独的.可重用的模块,自定义的组件(Component)有以下特点: 1.可以替代单独的widgit或者控制逻辑,或者你自己application的整个模块: 2.包含自己的view,通常也包含了自己的viewModel(这个viewModel也可以不进行定义) 3.可以预加载,可以通过AMD或者其他模块系统的方式根据需要异步加载 4.可以接收参数,根据需要选择性的对这些参数进行

lintcode 容易题:Find the Connected Component in the Undirected Graph 找出无向图汇总的相连要素

题目: 找出无向图汇总的相连要素 请找出无向图中相连要素的个数. 图中的每个节点包含其邻居的 1 个标签和 1 个列表.(一个无向图的相连节点(或节点)是一个子图,其中任意两个顶点通过路径相连,且不与超级图中的其它顶点相连.) 样例 给定图: A------B C \ | | \ | | \ | | \ | | D E 返回 {A,B,D}, {C,E}.其中有 2 个相连的元素,即{A,B,D}, {C,E} 解题: 广度优先+递归,写不出来,程序来源 Java程序: /** * Defini

KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

本节目录: 一个例子 API component生命周期 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, without parameters Second instance, passing parameters UI源码: <h4>First instance, without parameters</h4> <div data-bind='compon

Web前端知识技能大汇总

Web前端知识技能大汇总 来源:github 发布时间:2015-07-08 阅读次数:3432 28 项目起源 还记得@jayli 的这幅前端知识结构图么. 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个GitHub项目.我们可以通过协作的方式来共同维护这个项目.Git的历史记录也可以见证前端行业的一些变迁. 可视化效果 前端开发知识结构 前端工程师 浏览器 IE6/7/8/9/10/11 (Trident) Firefo

前端工程师必备技能汇总

首先,看一张前端知识结构图:  (原文: ithomer) 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个GitHub项目.我们可以通过协作的方式来共同维护这个项目.Git的历史记录也可以见证前端行业的一些变迁. 尽管会变成文字的方式来维护这些内容,但是我承诺写一个小工具帮大家生成更好玩的图形(基于DataV项目). 前端开发知识结构 前端工程师 浏览器 IE6/7/8/9/10/11 (Trident) Firefox (

web前端工程师必备技能汇总

web前端知识结构图. 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个github项目.我们可以通过协作的方式来共同维护这个项目.Git的历史记录也可以见证前端行业的一些变迁. 尽管会变成文字的方式来维护这些内容,但是我承诺写一个小工具帮大家生成更好玩的图形(基于DataV项目). 前端开发知识结构 前端工程师 SVG/Canvas/VML SVG: D3/Raphaël/Snap.svg/DataV Canvas: Cre

前端技能汇总 Frontend Knowledge Structure

Frontend Knowledge Structure 项目起源 还记得@jayli 的这幅前端知识结构图么. 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个GitHub项目.我们可以通过协作的方式来共同维护这个项目.Git的历史记录也可以见证前端行业的一些变迁. 尽管会变成文字的方式来维护这些内容,但是我承诺写一个小工具帮大家生成更好玩的图形(基于DataV项目). 前端开发知识结构 前端工程师 浏览器 IE6/7/8/

国内可外用免费语料库下载资源汇总, 语言翻译必备:国内外23个语料库推荐

国内可外用免费语料库下载资源汇总 (一) 国家语委1.国家语委现代汉语语料库http://www.cncorpus.org/现代汉语通用平衡语料库现在重新开放网络查询了.重开后的在线检索速度更快,功能更强,同时提供检索结果下载.现代汉语语料库在线提供免费检索的语料约2000万字,为分词和词性标注语料. 2.古代汉语语料库http://www.cncorpus.org/login.aspx网站现在还增加了一亿字的古代汉语生语料,研究古代汉语的也可以去查询和下载.同时,还提供了分词.词性标注软件.词