KnockoutJS 3.X API 第四章之數(shù)據(jù)控制流component綁定
一個例子
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();
這只是一個非常簡單的例子,在開發(fā)中,一般都是將View Model和Template寫成單獨外部文件,然后通過ko的components.register方法注冊他們,在以后的KO高級應用系列中將會進一步講解。
API
使用component綁定有兩種綁定語法
1. 快速語法:
只傳遞一個字符串作為組件名稱,比提供任何參數(shù)。例如:
<div data-bind='component: "my-component"'></div>
如果你覺得這種寫法有些死板的話,也可以傳遞一個監(jiān)控屬性,用其值作為組件名稱。待以后組件名變化的時候,直接修改監(jiān)控屬性值即可:
<div data-bind='component: observableWhoseValueIsAComponentName'></div>
2.完整語法:
提供完整的組件參數(shù),參數(shù)如下:
name - 注入組件的名稱??墒褂米址蚴潜O(jiān)控屬性。
params - 一組參數(shù)對象。通常,這是一個包含多個參數(shù)的鍵值對。
例如:
<div data-bind='component: { name: "shopping-cart", params: { mode: "detailed-list", items: productsList } }'></div>
備注1:僅模板式的component
通常的component綁定具有ViewModel和Template,但是這并不是必須的,有些時候一個component可能只包含一個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>
在或者使用客戶元素(以后的高級章節(jié)講解)進行注入視圖模型。
<special-offer params='productName: someProduct.name'></special-offer>
如上例子,HTML標記為模板名稱,其屬性params中注入視圖模型。
備注2:component虛擬綁定
如同之前章節(jié)的虛擬綁定一樣,同樣是使用<!-- ko -->和<!-- /ko -->這種方式實現(xiàn)虛擬綁定,來達到不更改DOM元素的目的
<!-- ko component: "message-editor" --> <!-- /ko -->
傳參的例子:
<!-- ko component: { name: "message-editor", params: { initialText: "Hello, world!", otherParam: 123 } } --> <!-- /ko -->
備注3:傳遞標記到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元素,當綁定后,my-special-list組件將會和這些DOM元素組成一個新的UI界面。在未來高級章節(jié)中,我們將會提到一個帶有DOM標記的自定義companent綁定的例子。盡情期待。先賣個關子~。
內存管理(了解即可,切勿鉆牛角尖)
您的視圖模型類可能有一個dispose函數(shù)。如果得以運行,KO將調用這個函數(shù)在內存中刪除組件,并從DOM中刪除。
在一下情況,您必須使用dispose以釋放垃圾收回資源。例如:
setInterval 回調后,需要明確清除。
使用clearInterval(handle)去清除他們,否則視圖模型在內存常駐。
ko.computed 回調后,直到明確設置成從它們的依賴接收通知。
如果一個依賴關系是外部的對象,那么一定要使用.dispose()來釋放計算監(jiān)控屬性,否則(也可能你的視圖模型)將在內存常駐。另外,可以考慮使用一個pureComputed,以避免人工處理的需求。
Subscriptions 回掉后,需要明確清除。
如果您已經(jīng)預訂到外部觀察時,一定要使用.dispose(),否則回調(也可能您的視圖模型)將在內存中常駐。
例如:
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 第四章之數(shù)據(jù)控制流component綁定,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- KnockoutJS 3.X API 第四章之數(shù)據(jù)控制流foreach綁定
- KnockoutJS 3.X API 第四章之數(shù)據(jù)控制流if綁定和ifnot綁定
- KnockoutJS 3.X API 第四章之數(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相結合實現(xiàn)增刪改查功能【二】
- BootstrapTable與KnockoutJS相結合實現(xiàn)增刪改查功能【一】
- KnockoutJS 3.X API 第四章之表單textInput、hasFocus、checked綁定
相關文章
javascript 動態(tài)改變層的Z-INDEX的代碼style.zIndex
javascript 動態(tài)改變層的Z-INDEX的代碼style.zIndex...2007-08-08使用JavaScript實現(xiàn)Java的List功能(實例講解)
使用JavaScript實現(xiàn)Java的List功能(實例講解)。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11arguments對象驗證函數(shù)的參數(shù)是否合法
Javascript函數(shù)中的參數(shù)對象arguments是個對象,而不是數(shù)組。但它可以類似數(shù)組那樣通過數(shù)字下表訪問其中的元素,而且它也有l(wèi)ength屬性標識它的元素的個數(shù)。2015-06-06