knockoutjs動態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實現(xiàn)方法
玩過knockoutjs的都知道,有一個強大的功能叫做component,而這個component有個牛逼的地方就是擁有自己的viewmodel和template,比如下面這樣:
ko.components.register('message-editor', {
viewModel: function(){},
template:""
});
很顯然,viewmodel就是function函數(shù)區(qū),而template就是模板區(qū),然后通過register函數(shù)將component注冊到knockout中,下面我們演示一個簡單的功能,就是動態(tài)的顯示當前“input”內(nèi)容的length長度。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="jquery-1.8.2.js"></script>
<script src="knockoutjs.js"></script>
</head>
<body>
<div data-bind='component: "message-editor"'></div>
<script type="text/javascript">
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: 'Message: <input data-bind="value: text" /> '
+ '(length: <span data-bind="text: text().length"></span>)'
});
ko.applyBindings();
</script>
</body>
</html>
請仔細看一下這段代碼,當前的component會將template模板inject到html的div的標簽中,而且這個template標記中還有一個text元素的綁定,而這個(text().length)的數(shù)據(jù)源剛好就是viewModel中的this.text..對吧。。。有了這兩個的合一,我們最后的html展示如下:

接下來我們隨便輸入一些數(shù)字,移開鼠標,這個時候會觸發(fā)input的change事件,比如下面這樣。

是不是好吊??? 當然有些人可能要問,如果在input呈現(xiàn)的時候賦予一點默認值呢???可不可以呢?當然也是可以的,這個時候我們可以在data-bind中默認賦予值就ok啦。。。比如下面這樣:
<body>
<h4>Second instance, passing parameters</h4>
<div data-bind='component: { name: "message-editor", params: { initialText: "Hello, world!" }}'></div>
<script type="text/javascript">
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: 'Message: <input data-bind="value: text" /> '
+ '(length: <span data-bind="text: text().length"></span>)'
});
ko.applyBindings();
</script>
</body>
可以看到,上面的代碼中我通過在component中的params對象中加入一個initialText屬性,這個時候就可以將這個initialText動態(tài)的注入到我們的viewModel中,然后我們的input和span元素通過data-bind 訂閱了這個viewModel中的this.text監(jiān)控屬性,這個時候就出現(xiàn)了實時更新操作了,迫不及待的看一下吧~

一:問題分析
好了,通過上面的演示,你或許發(fā)現(xiàn)到了如下兩個問題,第一個問題就是好強大,只要你register就可以了,根本不需要通過applyBindings來施加一個viewmodel,這樣就實現(xiàn)了頁面的模塊化,真的好便捷~ 所以這個問題是一個好事情, 第二個問題就是我們的template模板中的內(nèi)容是通過“硬編碼“的形式,也就是如果這個內(nèi)容有很多,比如有100行,200行,那我們是不是瘋了??? 就是你能耐再大也沒法一一拼接起來,就算拼起來,維護成本也太大了,所以問題來了,如何將template的content動態(tài)化??? 比如現(xiàn)實中我們看到的 百度文庫 的頁面。。。如下圖:

這個頁面中,有很多的模塊,比如我圈出來的上面3個,這三個模塊中的html肯定還是很多的吧~~~
二:template動態(tài)獲取
html內(nèi)容的動態(tài)獲取,通常有兩種方式,第一種就是RequireJs,當然你需要引用這么一個js,第二種就是我們重寫他們的模板,當然這篇我們講解后面的這種方式,我們要做的就是重寫component中的loadTemplate函數(shù),然后替換默認的defaultLoader加載器,是不是很簡單呢???
1. 重寫loadtemplate方法
//第一步:重寫loadTemplate方法
var templateFromUrlLoader = {
loadTemplate: function(name, templateConfig, callback) {
if (templateConfig.fromUrl) {
var fullUrl = '/' + templateConfig.fromUrl
//ajax動態(tài)獲取外部的file內(nèi)容
$.get(fullUrl, function(markupString) {
ko.components.defaultLoader.loadTemplate(name, markupString, callback);
});
} else {
callback(null);
}
}
};
//替換原來的defaultLoader,實現(xiàn)新的templateFromUrlLoader
ko.components.loaders.unshift(templateFromUrlLoader);
2. 將hard codeing 放入到外部的file,比如我新建了一個file.html文件。

3. 再register組件,然后在template標記上引用外面文件路徑,比如下面的{ fromUrl: 'file.html' }
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: { fromUrl: 'file.html' },
});
好了,所有功能都準備完畢了,我們?yōu)g覽一下頁面,看看是啥樣的???

終于大功搞成了,對不對撒~~~然后是不是就可以延伸到上面介紹的“百度文庫”的例子,我們可以把各個模塊的html放到一個單獨的文件中.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="jquery-1.8.2.js"></script>
<script src="knockoutjs.js"></script>
</head>
<body>
<div data-bind='component: { name: "message-editor", params: { initialText: "你好撒?。?!" }}'></div>
<script type="text/javascript">
//第一步:重寫loadTemplate方法
var templateFromUrlLoader = {
loadTemplate: function (name, templateConfig, callback) {
if (templateConfig.fromUrl) {
var fullUrl = '/' + templateConfig.fromUrl
//ajax動態(tài)獲取外部的file內(nèi)容
$.get(fullUrl, function (markupString) {
ko.components.defaultLoader.loadTemplate(name, markupString, callback);
});
} else {
callback(null);
}
}
};
//替換原來的defaultLoader,實現(xiàn)新的templateFromUrlLoader
ko.components.loaders.unshift(templateFromUrlLoader);
ko.components.register('message-editor', {
viewModel: function (params) {
this.text = ko.observable(params && params.initialText || '');
},
template: { fromUrl: 'file.html' },
});
ko.applyBindings();
</script>
</body>
</html>
以上所述是小編給大家介紹的knockoutjs動態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- KnockoutJS 3.X API 第四章之click綁定
- KnockoutJS 3.X API 第四章之事件event綁定
- KnockoutJS 3.X API 第四章之表單submit、enable、disable綁定
- KnockoutJS 3.X API 第四章之表單value綁定
- BootstrapTable與KnockoutJS相結(jié)合實現(xiàn)增刪改查功能【二】
- BootstrapTable與KnockoutJS相結(jié)合實現(xiàn)增刪改查功能【一】
- Bootstrap與KnockoutJs相結(jié)合實現(xiàn)分頁效果實例詳解
- KnockoutJS 3.X API 第四章之數(shù)據(jù)控制流component綁定
相關(guān)文章
Javascript實現(xiàn)關(guān)聯(lián)數(shù)據(jù)(Linked Data)查詢及注意細節(jié)
DBpedia對Wikipedia的數(shù)據(jù)變成Linked Data形式,使得機器也能讀懂并自由獲得這些數(shù)據(jù);本文的主要目的是利用Javascript從DBpedia中獲取我們想要的數(shù)據(jù),感興趣的朋友可以參考下,希望可以幫助到你2013-02-02
通過修改360搶票的刷新頻率和突破8車次限制實現(xiàn)方法
這篇文章主要介紹了通過修改360搶票的刷新頻率和突破8車次限制實現(xiàn)方法的相關(guān)資料,現(xiàn)在刷票工具很多,這里就舉一例修改,增加搶票頻率及突破8車次限制,需要的朋友可以參考下2017-01-01
JS針對瀏覽器窗口關(guān)閉事件的監(jiān)聽方法集錦
這篇文章主要介紹了JS針對瀏覽器窗口關(guān)閉事件的監(jiān)聽方法,總結(jié)整理了幾種常用的瀏覽器關(guān)閉事件監(jiān)聽方法,非常簡單實用,需要的朋友可以參考下2016-06-06
再也不怕 JavaScript 報錯了,怎么看怎么處理都在這兒
這篇文章主要介紹了再也不怕 JavaScript 報錯了,怎么看怎么處理都在這兒,需要的朋友可以參考下2020-12-12
JavaScript lodash常見用法系列小結(jié)
本篇文章主要介紹了JavaScript lodash用法小結(jié),非常不錯,具有參考借鑒價值,對于Javascript lodash教程感興趣的同學可以參考一下2016-08-08
淺談es6中export和export default的作用及區(qū)別
下面小編就為大家分享一篇淺談es6中export和export default的作用及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
微信小程序?qū)崿F(xiàn)側(cè)邊欄二級聯(lián)動
這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)側(cè)邊欄二級聯(lián)動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07

