KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流component綁定
一個(gè)例子

UI源碼:
<h4>First instance, without parameters</h4>
<div data-bind='component: "message-editor"'></div>
<h4>Second instance, passing parameters</h4>
<div data-bind='component: {
name: "message-editor",
params: { initialText: "Hello, world!" }
}'></div>
視圖模型源碼:
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();
這只是一個(gè)非常簡(jiǎn)單的例子,在開發(fā)中,一般都是將View Model和Template寫成單獨(dú)外部文件,然后通過ko的components.register方法注冊(cè)他們,在以后的KO高級(jí)應(yīng)用系列中將會(huì)進(jìn)一步講解。
API
使用component綁定有兩種綁定語(yǔ)法
1. 快速語(yǔ)法:
只傳遞一個(gè)字符串作為組件名稱,比提供任何參數(shù)。例如:
<div data-bind='component: "my-component"'></div>
如果你覺得這種寫法有些死板的話,也可以傳遞一個(gè)監(jiān)控屬性,用其值作為組件名稱。待以后組件名變化的時(shí)候,直接修改監(jiān)控屬性值即可:
<div data-bind='component: observableWhoseValueIsAComponentName'></div>
2.完整語(yǔ)法:
提供完整的組件參數(shù),參數(shù)如下:
name - 注入組件的名稱。可使用字符串或是監(jiān)控屬性。
params - 一組參數(shù)對(duì)象。通常,這是一個(gè)包含多個(gè)參數(shù)的鍵值對(duì)。
例如:
<div data-bind='component: {
name: "shopping-cart",
params: { mode: "detailed-list", items: productsList }
}'></div>
備注1:僅模板式的component
通常的component綁定具有ViewModel和Template,但是這并不是必須的,有些時(shí)候一個(gè)component可能只包含一個(gè)Template。例如:
ko.components.register('special-offer', {
template: '<div class="offer-box" data-bind="text: productName"></div>'
});
可以使用注入的方式,將視圖模型注入給Template:
<div data-bind='component: {
name: "special-offer-callout",
params: { productName: someProduct.name }
}'></div>
在或者使用客戶元素(以后的高級(jí)章節(jié)講解)進(jìn)行注入視圖模型。
<special-offer params='productName: someProduct.name'></special-offer>
如上例子,HTML標(biāo)記為模板名稱,其屬性params中注入視圖模型。
備注2:component虛擬綁定
如同之前章節(jié)的虛擬綁定一樣,同樣是使用<!-- ko -->和<!-- /ko -->這種方式實(shí)現(xiàn)虛擬綁定,來(lái)達(dá)到不更改DOM元素的目的
<!-- ko component: "message-editor" --> <!-- /ko -->
傳參的例子:
<!-- ko component: {
name: "message-editor",
params: { initialText: "Hello, world!", otherParam: 123 }
} -->
<!-- /ko -->
備注3:傳遞標(biāo)記到component綁定
<div data-bind="component: { name: 'my-special-list', params: { items: someArrayOfPeople } }">
<!-- Look, here's some arbitrary markup. By default it gets stripped out
and is replaced by the component output. -->
The person <em data-bind="text: name"></em>
is <em data-bind="text: age"></em> years old.
</div>
如上例子中,既有component綁定,也有一些DOM元素,當(dāng)綁定后,my-special-list組件將會(huì)和這些DOM元素組成一個(gè)新的UI界面。在未來(lái)高級(jí)章節(jié)中,我們將會(huì)提到一個(gè)帶有DOM標(biāo)記的自定義companent綁定的例子。盡情期待。先賣個(gè)關(guān)子~。
內(nèi)存管理(了解即可,切勿鉆牛角尖)
您的視圖模型類可能有一個(gè)dispose函數(shù)。如果得以運(yùn)行,KO將調(diào)用這個(gè)函數(shù)在內(nèi)存中刪除組件,并從DOM中刪除。
在一下情況,您必須使用dispose以釋放垃圾收回資源。例如:
setInterval 回調(diào)后,需要明確清除。
使用clearInterval(handle)去清除他們,否則視圖模型在內(nèi)存常駐。
ko.computed 回調(diào)后,直到明確設(shè)置成從它們的依賴接收通知。
如果一個(gè)依賴關(guān)系是外部的對(duì)象,那么一定要使用.dispose()來(lái)釋放計(jì)算監(jiān)控屬性,否則(也可能你的視圖模型)將在內(nèi)存常駐。另外,可以考慮使用一個(gè)pureComputed,以避免人工處理的需求。
Subscriptions 回掉后,需要明確清除。
如果您已經(jīng)預(yù)訂到外部觀察時(shí),一定要使用.dispose(),否則回調(diào)(也可能您的視圖模型)將在內(nèi)存中常駐。
例如:
var someExternalObservable = ko.observable(123);
function SomeComponentViewModel() {
this.myComputed = ko.computed(function() {
return someExternalObservable() + 1;
}, this);
this.myPureComputed = ko.pureComputed(function() {
return someExternalObservable() + 2;
}, this);
this.mySubscription = someExternalObservable.subscribe(function(val) {
console.log('The external observable changed to ' + val);
}, this);
this.myIntervalHandle = window.setInterval(function() {
console.log('Another second passed, and the component is still alive.');
}, 1000);
}
SomeComponentViewModel.prototype.dispose = function() {
this.myComputed.dispose();
this.mySubscription.dispose();
window.clearInterval(this.myIntervalHandle);
// this.myPureComputed doesn't need to be manually disposed.
}
ko.components.register('your-component-name', {
viewModel: SomeComponentViewModel,
template: 'some template'
});
以上所述是小編給大家介紹的KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流component綁定,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流foreach綁定
- KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流if綁定和ifnot綁定
- KnockoutJS 3.X API 第四章之?dāng)?shù)據(jù)控制流with綁定
- 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é)合實(shí)現(xiàn)增刪改查功能【二】
- BootstrapTable與KnockoutJS相結(jié)合實(shí)現(xiàn)增刪改查功能【一】
- KnockoutJS 3.X API 第四章之表單textInput、hasFocus、checked綁定
相關(guān)文章
讓iframe子窗體取父窗體地址欄參數(shù)(querystring)
突然用到,記錄一下,對(duì)地址欄字符串用正則處理最好,有時(shí)間研究一下。 主要是思路。2009-10-10
JS使用Chrome瀏覽器實(shí)現(xiàn)調(diào)試線上代碼
這篇文章主要介紹了JS使用Chrome瀏覽器實(shí)現(xiàn)調(diào)試線上代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
javascript數(shù)組按屬性分組實(shí)現(xiàn)方法
在開發(fā)過程中,前端有時(shí)需要對(duì)后端返回的數(shù)據(jù)進(jìn)行一些處理,當(dāng)后端返回給我們json對(duì)象數(shù)組時(shí),我們可能會(huì)需要按照對(duì)象中的某一個(gè)屬性來(lái)進(jìn)行分組,下面這篇文章主要給大家介紹了關(guān)于javascript數(shù)組按屬性分組的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-05-05
javascript實(shí)現(xiàn)鎖定網(wǎng)頁(yè)、密碼解鎖效果(類似系統(tǒng)屏幕保護(hù)效果)
這篇文章主要介紹了javascript實(shí)現(xiàn)鎖定網(wǎng)頁(yè)、密碼解鎖效果,跟Windows系統(tǒng)的屏幕保護(hù)效果類似,需要的朋友可以參考下2014-08-08
JavaScript日期時(shí)間格式化函數(shù)分享
這篇文章主要介紹了JavaScript日期時(shí)間格式化函數(shù)分享,需要的朋友可以參考下2014-05-05
(推薦一個(gè)超好的JS函數(shù)庫(kù))S.Sams Lifexperience ScriptClassLib
(推薦一個(gè)超好的JS函數(shù)庫(kù))S.Sams Lifexperience ScriptClassLib...2007-04-04

