新聞中心
第三章所有代碼都需要啟用KO的ko.applyBindings(viewModel);功能,才能使代碼生效,為了節(jié)約篇幅,所有例子均省略了此行代碼。

創(chuàng)新互聯(lián)公司是專業(yè)的西湖網(wǎng)站建設(shè)公司,西湖接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行西湖網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
1 visible 綁定
目的
visible綁定到DOM元素上,使得該元素的hidden或visible狀態(tài)取決于綁定的值。
例子
- You will see this message only when "shouldShowMessage" holds a true value.
- var viewModel = {
- shouldShowMessage: ko.observable(true) // Message initially visible
- };
- viewModel.shouldShowMessage(false); // ... now it's hidden
- viewModel.shouldShowMessage(true); // ... now it's visible again
參數(shù)
主參數(shù)
當(dāng)參數(shù)設(shè)置為一個(gè)假值時(shí)(例如:布爾值false, 數(shù)字值0, 或者null, 或者undefined) ,該綁定將設(shè)置該元素的style.display值為none,讓元素隱藏。它的優(yōu)先級(jí)高于你在CSS里定義的任何display樣式。
當(dāng)參數(shù)設(shè)置為一個(gè)真值時(shí)(例如:布爾值true,或者非空non-null的對(duì)象或者數(shù)組) ,該綁定會(huì)刪除該元素的style.display值,讓元素可見。然后你在CSS里自定義的display樣式將會(huì)自動(dòng)生效。
如果參數(shù)是監(jiān)控屬性observable的,那元素的visible狀態(tài)將根據(jù)參數(shù)值的變化而變化,如果不是,那元素的visible狀態(tài)將只設(shè)置一次并且以后不在更新。
其它參數(shù)
無
注:使用函數(shù)或者表達(dá)式來控制元素的可見性
你也可以使用JavaScript函數(shù)或者表達(dá)式作為參數(shù)。這樣的話,函數(shù)或者表達(dá)式的結(jié)果將決定是否顯示/隱藏這個(gè)元素。例如:
0">- You will see this message only when 'myValues' has at least one member.
- var viewModel = {
- myValues: ko.observableArray([]) // Initially empty, so message hidden
- };
- viewModel.myValues.push("some value"); // Now visible
依賴性
除KO核心類庫外,無依賴。
2 text 綁定
目的
text 綁定到DOM元素上,使得該元素顯示的文本值為你綁定的參數(shù)。該綁定在顯示或者上非常有用,但是你可以用在任何元素上。
例子
- Today's message is:
- var viewModel = {
- myMessage: ko.observable() // Initially blank
- };
- viewModel.myMessage("Hello, world!"); // Text appears
參數(shù)
主參數(shù)
KO將參數(shù)值會(huì)設(shè)置在元素的innerText (IE)或textContent(Firefox和其它相似瀏覽器)屬性上。原來的文本將會(huì)被覆蓋。
如果參數(shù)是監(jiān)控屬性observable的,那元素的text文本將根據(jù)參數(shù)值的變化而更新,如果不是,那元素的text文本將只設(shè)置一次并且以后不在更新。
如果你傳的是不是數(shù)字或者字符串(例如一個(gè)對(duì)象或者數(shù)組),那顯示的文本將是yourParameter.toString()的等價(jià)內(nèi)容。
其它參數(shù)
無
注1:使用函數(shù)或者表達(dá)式來決定text值
如果你想讓你的text更可控,那選擇是創(chuàng)建一個(gè)依賴監(jiān)控屬性(dependent observable),然后在它的執(zhí)行函數(shù)里編碼,決定應(yīng)該顯示什么樣的text文本。
例如:
- The item is today.
- var viewModel = {
- price: ko.observable(24.95)
- };
- viewModel.priceRating = ko.dependentObservable(function () {
- returnthis.price() >50?"expensive" : "affordable";
- }, viewModel);
現(xiàn)在,text文本將在“expensive”和“affordable”之間替換,取決于價(jià)格怎么改變。
然而,如果有類似需求的話其實(shí)沒有必要再聲明一個(gè)依賴監(jiān)控屬性(dependent observable), 你只需要按照如下代碼寫JavaScript表達(dá)式就可以了:
- The item is 50 ? 'expensive' : 'affordable'"> today.
結(jié)果是一樣的,但我們不需要再聲明依賴監(jiān)控屬性(dependent observable)。
注2:關(guān)于HTML encoding
因?yàn)樵摻壎ㄊ窃O(shè)置元素的innerText或textContent (而不是innerHTML),所以它是安全的,沒有HTML或者腳本注入的風(fēng)險(xiǎn)。例如:如果你編寫如下代碼:
- viewModel.myMessage("Hello, world!");
… 它不會(huì)顯示斜體字,而是原樣輸出標(biāo)簽。如果你需要顯示HTML內(nèi)容,請(qǐng)參考html綁定.
注3:關(guān)于IE 6的白空格whitespace
IE6有個(gè)奇怪的問題,如果 span里有空格的話,它將自動(dòng)變成一個(gè)空的span。如果你想編寫如下的代碼的話,那Knockout將不起任何作用:
- Welcome, to our web site.
… IE6 將不會(huì)顯示span中間的那個(gè)空格,你可以通過下面這樣的代碼避免這個(gè)問題:
- Welcome, to our web site.
IE6以后版本和其它瀏覽器都沒有這個(gè)問題
依賴性
除KO核心類庫外,無依賴。
#p#
3 html 綁定
目的
html綁定到DOM元素上,使得該元素顯示的HTML值為你綁定的參數(shù)。如果在你的view model里聲明HTML標(biāo)記并且render的話,那非常有用。
例子
- var viewModel = {
- details: ko.observable() // Initially blank
- };
- viewModel.details("For further details, view the report here.");
- // HTML content appears
參數(shù)
主參數(shù)
KO設(shè)置該參數(shù)值到元素的innerHTML屬性上,元素之前的內(nèi)容將被覆蓋。
如果參數(shù)是監(jiān)控屬性observable的,那元素的內(nèi)容將根據(jù)參數(shù)值的變化而更新,如果不是,那元素的內(nèi)容將只設(shè)置一次并且以后不在更新。
如果你傳的是不是數(shù)字或者字符串(例如一個(gè)對(duì)象或者數(shù)組),那顯示的文本將是yourParameter.toString()的等價(jià)內(nèi)容。
其它參數(shù)
無
注:關(guān)于HTML encoding
因?yàn)樵摻壎ㄔO(shè)置元素的innerHTML,你應(yīng)該注意不要使用不安全的HTML代碼,因?yàn)橛锌赡芤鹉_本注入攻擊。如果你不確信是否安全(比如顯示用戶輸入的內(nèi)容),那你應(yīng)該使用text綁定,因?yàn)檫@個(gè)綁定只是設(shè)置元素的text 值innerText和textContent。
依賴性
除KO核心類庫外,無依賴。
4 css 綁定
目的
css綁定是添加或刪除一個(gè)或多個(gè)CSS class到DOM元素上。 非常有用,比如當(dāng)數(shù)字變成負(fù)數(shù)時(shí)高亮顯示。(注:如果你不想應(yīng)用CSS class而是想引用style屬性的話,請(qǐng)參考style綁定。)
例子
- Profit Information
- var viewModel = {
- currentProfit: ko.observable(150000)
- // Positive value, so initially we don't apply the "profitWarning" class
- };
- viewModel.currentProfit(-50);
- // Causes the "profitWarning" class to be applied
效果就是當(dāng)currentProfit 小于0的時(shí)候,添加profitWarning CSS class到元素上,如果大于0則刪除這個(gè)CSS class。
參數(shù)
主參數(shù)
該參數(shù)是一個(gè)JavaScript對(duì)象,屬性是你的CSS class名稱,值是比較用的true或false,用來決定是否應(yīng)該使用這個(gè)CSS class。
你可以一次設(shè)置多個(gè)CSS class。例如,如果你的view model有一個(gè)叫isServre的屬性,
非布爾值會(huì)被解析成布爾值。例如, 0和null被解析成false,21和非null對(duì)象被解析成true。
如果參數(shù)是監(jiān)控屬性observable的,那隨著值的變化將會(huì)自動(dòng)添加或者刪除該元素上的CSS class。如果不是,那CSS class將會(huì)只添加或者刪除一次并且以后不在更新。
你可以使用任何JavaScript表達(dá)式或函數(shù)作為參數(shù)。KO將用它的執(zhí)行結(jié)果來決定是否應(yīng)用或刪除CSS class。
其它參數(shù)
無
注:應(yīng)用的CSS class的名字不是合法的JavaScript變量命名
如果你想使用my-class class,你不能寫成這樣:
...… 因?yàn)閙y-class不是一個(gè)合法的命名。解決方案是:在my-class兩邊加引號(hào)作為一個(gè)字符串使用。這是一個(gè)合法的JavaScript 對(duì)象 文字(從JSON技術(shù)規(guī)格說明來說,你任何時(shí)候都應(yīng)該這樣使用,雖然不是必須的)。例如,
依賴性
除KO核心類庫外,無依賴。
5 style 綁定
目的
style綁定是添加或刪除一個(gè)或多個(gè)DOM元素上的style值。比如當(dāng)數(shù)字變成負(fù)數(shù)時(shí)高亮顯示,或者根據(jù)數(shù)字顯示對(duì)應(yīng)寬度的Bar。(注:如果你不是應(yīng)用style值而是應(yīng)用CSS class的話,請(qǐng)參考CSS綁定。)
例子
- Profit Information
- var viewModel = {
- currentProfit: ko.observable(150000) // Positive value, so initially black
- };
- viewModel.currentProfit(-50); // Causes the DIV's contents to go red
當(dāng)currentProfit 小于0的時(shí)候div的style.color是紅色,大于的話是黑色。
參數(shù)
主參數(shù)
該參數(shù)是一個(gè)JavaScript對(duì)象,屬性是你的style的名稱,值是該style需要應(yīng)用的值。
你可以一次設(shè)置多個(gè)style值。例如,如果你的view model有一個(gè)叫isServre的屬性,
...如果參數(shù)是監(jiān)控屬性observable的,那隨著值的變化將會(huì)自動(dòng)添加或者刪除該元素上的style值。如果不是,那style值將會(huì)只應(yīng)用一次并且以后不在更新。
你可以使用任何JavaScript表達(dá)式或函數(shù)作為參數(shù)。KO將用它的執(zhí)行結(jié)果來決定是否應(yīng)用或刪除style值。
其它參數(shù)
無
注:應(yīng)用的style的名字不是合法的JavaScript變量命名
如果你需要應(yīng)用font-weight或者text-decoration,你不能直接使用,而是要使用style對(duì)應(yīng)的JavaScript名稱。
錯(cuò)誤: { font-weight: someValue }; 正確: { fontWeight: someValue }
錯(cuò)誤: { text-decoration: someValue }; 正確: { textDecoration: someValue }
參考:style名稱和對(duì)應(yīng)的JavaScript 名稱列表。
依賴性
除KO核心類庫外,無依賴。
6 attr 綁定
目的
attr 綁定提供了一種方式可以設(shè)置DOM元素的任何屬性值。你可以設(shè)置img的src屬性,連接的href屬性。使用綁定,當(dāng)模型屬性改變的時(shí)候,它會(huì)自動(dòng)更新。
例子
呈現(xiàn)結(jié)果是該連接的href屬性被設(shè)置為year-end.html, title屬性被設(shè)置為Report including final year-end statistics。
參數(shù)
主參數(shù)
該參數(shù)是一個(gè)JavaScript對(duì)象,屬性是你的attribute名稱,值是該attribute需要應(yīng)用的值。
如果參數(shù)是監(jiān)控屬性observable的,那隨著值的變化將會(huì)自動(dòng)添加或者刪除該元素上的attribute值。如果不是,那attribute值將會(huì)只應(yīng)用一次并且以后不在更新。
其它參數(shù)
無
注:應(yīng)用的屬性名字不是合法的JavaScript變量命名
如果你要用的屬性名稱是data-something的話,你不能這樣寫:
...… 因?yàn)閐ata-something 不是一個(gè)合法的命名。解決方案是:在data-something兩邊加引號(hào)作為一個(gè)字符串使用。這是一個(gè)合法的JavaScript 對(duì)象 文字(從JSON技術(shù)規(guī)格說明來說,你任何時(shí)候都應(yīng)該這樣使用,雖然不是必須的)。例如,
...依賴性
除KO核心類庫外,無依賴。
#p#
7 click 綁定
目的
click綁定在DOM元素上添加事件句柄以便元素被點(diǎn)擊的時(shí)候執(zhí)行定義的JavaScript 函數(shù)。大部分是用在button,input和連接a上,但是可以在任意元素上使用。
例子
- You've clicked times
- var viewModel = {
- numberOfClicks: ko.observable(0),
- incrementClickCounter: function () {
- var previousCount =this.numberOfClicks();
- this.numberOfClicks(previousCount +1);
- }
- };
每次點(diǎn)擊按鈕的時(shí)候,都會(huì)調(diào)用incrementClickCounter()函數(shù),然后更新自動(dòng)更新點(diǎn)擊次數(shù)。
參數(shù)
主參數(shù)
Click點(diǎn)擊事件時(shí)所執(zhí)行的函數(shù)。
你可以聲明任何JavaScript函數(shù) – 不一定非要是view model里的函數(shù)。你可以聲明任意對(duì)象上的任何函數(shù),例如: someObject.someFunction。
View model上的函數(shù)在用的時(shí)候有一點(diǎn)點(diǎn)特殊,就是不需要引用對(duì)象的,直接引用函數(shù)本身就行了,比如直接寫incrementClickCounter 就可以了,而無需寫成: viewModel.incrementClickCounter(盡管是合法的)。
其它參數(shù)
無
注1:傳參數(shù)給你的click 句柄
最簡單的辦法是傳一個(gè)function包裝的匿名函數(shù):
- Click me
這樣,KO就會(huì)調(diào)用這個(gè)匿名函數(shù),里面會(huì)執(zhí)行viewModel.myFunction(),并且傳進(jìn)了'param1' 和'param2'參數(shù)。
注2:訪問事件源對(duì)象
有些情況,你可能需要使用事件源對(duì)象,Knockout會(huì)將這個(gè)對(duì)象傳遞到你函數(shù)的第一個(gè)參數(shù):
- Click me
- var viewModel = {
- myFunction: function (event) {
- if (event.shiftKey) {
- //do something different when user has shift key down
- } else {
- //do normal action
- }
- }
- };
如果你需要的話,可以使用匿名函數(shù)的第一個(gè)參數(shù)傳進(jìn)去,然后在里面調(diào)用:
- Click me
這樣,KO就會(huì)將事件源對(duì)象傳遞給你的函數(shù)并且使用了。
注3: 允許執(zhí)行默認(rèn)事件
默認(rèn)情況下,Knockout會(huì)阻止冒泡,防止默認(rèn)的事件繼續(xù)執(zhí)行。例如,如果你點(diǎn)擊一個(gè)a連接,在執(zhí)行完自定義事件時(shí)它不會(huì)連接到href地址。這特別有用是因?yàn)槟愕淖远x事件主要就是操作你的view model,而不是連接到另外一個(gè)頁面。
當(dāng)然,如果你想讓默認(rèn)的事件繼續(xù)執(zhí)行,你可以在你click的自定義函數(shù)里返回true。
注4:控制this句柄
初學(xué)者可以忽略這小節(jié),因?yàn)榇蟛糠侄加貌恢?,高?jí)用戶可以參考如下內(nèi)容:
KO在調(diào)用你定義的函數(shù)時(shí),會(huì)將view model傳給this對(duì)象(也就是ko.applyBindings使用的view model)。主要是方便你在調(diào)用你在view model里定義的方法的時(shí)候可以很容易再調(diào)用view model里定義的其它屬性。例如: this.someOtherViewModelProperty。
如果你想引用其它對(duì)象,我們有兩種方式:
◆ 你可以和注1里那樣使用匿名函數(shù),因?yàn)樗С秩我釰avaScript 對(duì)象。
◆ 你也可以直接引用任何函數(shù)對(duì)象。你可以使用bind使callback函數(shù)設(shè)置this為任何你選擇的對(duì)象。例如:
- Click me
如果你是C#或Java開發(fā)人員,你可以疑惑為什么我們還要用bind函數(shù)到一個(gè)對(duì)象想,特別是像調(diào)用someObject.someFunction。 原因是在JavaScript里,函數(shù)自己不是類的一部分,他們?cè)趩为?dú)存在的對(duì)象,有可能多個(gè)對(duì)象都引用同樣的someFunction函數(shù),所以當(dāng)這個(gè)函數(shù)被調(diào)用的時(shí)候它不知道誰調(diào)用的(設(shè)置this給誰)。在你bind之前運(yùn)行時(shí)是不會(huì)知道的。KO默認(rèn)情況下設(shè)置this對(duì)象是view model,但你可以用bind語法重定義它。
在注1里使用匿名函數(shù)的時(shí)候沒有具體的要求,因?yàn)镴avaScript代碼 someObject.someFunction()就意味著調(diào)用someFunction,然后設(shè)置this到 someObject對(duì)象上。
注5:防止事件冒泡
默認(rèn)情況下,Knockout允許click事件繼續(xù)在更高一層的事件句柄上冒泡執(zhí)行。例如,如果你的元素和父元素都綁定了click事件,那當(dāng)你點(diǎn)擊該元素的時(shí)候兩個(gè)事件都會(huì)觸發(fā)的。如果需要,你可以通過額外的綁定clickBubble來禁止冒泡。例如:
- Click me
默認(rèn)情況下,myButtonHandler會(huì)先執(zhí)行,然后會(huì)冒泡執(zhí)行myDivHandler。但一旦你設(shè)置了clickBubble為false的時(shí)候,冒泡事件會(huì)被禁止。
依賴性
除KO核心類庫外,無依賴。
#p#
8 event 綁定
目的
event綁定在DOM元素上添加指定的事件句柄以便元素被觸發(fā)的時(shí)候執(zhí)行定義的JavaScript 函數(shù)。大部分情況下是用在keypress,mouseover和mouseout上。
例子
- Mouse over me
- Details
- var viewModel = {
- detailsEnabled: ko.observable(false),
- enableDetails: function () {
- this.detailsEnabled(true);
- },
- disableDetails: function () {
- this.detailsEnabled(false);
- }
- };
每次鼠標(biāo)在第一個(gè)元素上移入移出的時(shí)候都會(huì)調(diào)用view model上的方法來toggle detailsEnabled的值,而第二個(gè)元素會(huì)根據(jù)detailsEnabled的值自動(dòng)顯示或者隱藏。
參數(shù)
主參數(shù)
你需要傳入的是一個(gè)JavaScript對(duì)象,他的屬性名是事件名稱,值是你所需要執(zhí)行的函數(shù)。
你可以聲明任何JavaScript函數(shù) – 不一定非要是view model里的函數(shù)。你可以聲明任意對(duì)象上的任何函數(shù),例如: event: { mouseover: someObject.someFunction }。
View model上的函數(shù)在用的時(shí)候有一點(diǎn)點(diǎn)特殊,就是不需要引用對(duì)象的,直接引用函數(shù)本身就行了,比如直接寫event: { mouseover: enableDetails } 就可以了,而無需寫成: event: { mouseover: viewModel.enableDetails } (盡管是合法的)。
其它參數(shù)
無
9 submit 綁定
目的
submit綁定在form表單上添加指定的事件句柄以便該form被提交的時(shí)候執(zhí)行定義的JavaScript 函數(shù)。只能用在表單form元素上。
當(dāng)你使用submit綁定的時(shí)候, Knockout會(huì)阻止form表單默認(rèn)的submit動(dòng)作。換句話說,瀏覽器會(huì)執(zhí)行你定義的綁定函數(shù)而不會(huì)提交這個(gè)form表單到服務(wù)器上??梢院芎玫亟忉屵@個(gè),使用submit綁定就是為了處理view model的自定義函數(shù)的,而不是再使用普通的HTML form表單。如果你要繼續(xù)執(zhí)行默認(rèn)的HTML form表單操作,你可以在你的submit句柄里返回true。
例子
- ... form contents go here ...
- var viewModel = {
- doSomething: function (formElement) {
- // ... now do something
- }
- };
這個(gè)例子里,KO將把整個(gè)form表單元素作為參數(shù)傳遞到你的submit綁定函數(shù)里。 你可以忽略不管,但是有些例子里是否有用,參考:ko.postJson工具。
為什么不在submit按鈕上使用click綁定?
在form上,你可以使用click綁定代替submit綁定。不過submit可以handle其它的submit行為,比如在輸入框里輸入回車的時(shí)候可以提交表單。
參數(shù)
主參數(shù)
你綁定到submit事件上的函數(shù)
你可以聲明任何JavaScript函數(shù) – 不一定非要是view model里的函數(shù)。你可以聲明任意對(duì)象上的任何函數(shù),例如: submit: someObject.someFunction。
View model上的函數(shù)在用的時(shí)候有一點(diǎn)點(diǎn)特殊,就是不需要引用對(duì)象的,直接引用函數(shù)本身就行了,比如直接寫submit: doSomething就可以了,而無需寫成: submit: viewModel. doSomething(盡管是合法的)。
其它參數(shù)
無
備注:
關(guān)于如果傳遞更多的參數(shù)給submit綁定函數(shù),或者當(dāng)調(diào)用非view model里的函數(shù)的時(shí)如何控制this,請(qǐng)參考click綁定。所有click綁定相關(guān)的notes也都適用于submit綁定。
依賴性
除KO核心類庫外,無依賴。
10 enable 綁定
目的
enable綁定使DOM元素只有在參數(shù)值為 true的時(shí)候才enabled。在form表單元素input,select,和textarea上非常有用。
例子
- I have a cellphone
- Your cellphone number:
- var viewModel = {
- hasCellphone: ko.observable(false),
- cellphoneNumber: ""
- };
這個(gè)例子里,“Your cellphone number”后的text box 初始情況下是禁用的,只有當(dāng)用戶點(diǎn)擊標(biāo)簽 “I have a cellphone”的時(shí)候才可用。
參數(shù)
主參數(shù)
聲明DOM元素是否可用enabled。
非布爾值會(huì)被解析成布爾值。例如0和null被解析成false,21和非null對(duì)象被解析給true。
如果你的參數(shù)是observable的,那綁定會(huì)隨著observable值的改變而自動(dòng)更新enabled/disabled狀態(tài)。如果不是,則只會(huì)設(shè)置一次并且以后不再更新。
其它參數(shù)
無
注:任意使用JavaScript表達(dá)式
不緊緊限制于變量 – 你可以使用任何JavaScript表達(dá)式來控制元素是否可用。例如,
- Do something
依賴性
除KO核心類庫外,無依賴。
11 disable 綁定
目的
disable綁定使DOM元素只有在參數(shù)值為 true的時(shí)候才disabled。在form表單元素input,select,和textarea上非常有用。
disable綁定和enable綁定正好相反,詳情請(qǐng)參考enable綁定。
#p#
12 value 綁定
目的
value綁定是關(guān)聯(lián)DOM元素的值到view model的屬性上。主要是用在表單控件,
當(dāng)用戶編輯表單控件的時(shí)候, view model對(duì)應(yīng)的屬性值會(huì)自動(dòng)更新。同樣,當(dāng)你更新view model屬性的時(shí)候,相對(duì)應(yīng)的元素值在頁面上也會(huì)自動(dòng)更新。
注:如果你在checkbox或者radio button上使用checked綁定來讀取或者寫入元素的 checked狀態(tài),而不是value 值的綁定。
例子
Login name:
Password:
- var viewModel = {
- userName: ko.observable(""), // Initially blank
- userPassword: ko.observable("abc"), // Prepopulate
- };
參數(shù)
主參數(shù)
KO設(shè)置此參數(shù)為元素的value值。之前的值將被覆蓋。
如果參數(shù)是監(jiān)控屬性observable的,那元素的value值將根據(jù)參數(shù)值的變化而更新,如果不是,那元素的value值將只設(shè)置一次并且以后不在更新。
如果你提供的參數(shù)不是一個(gè)數(shù)字或者字符串(而是對(duì)象或者數(shù)組)的話,那顯示的value值就是yourParameter.toString() 的內(nèi)容(通常沒用,所以最好都設(shè)置為數(shù)字或者字符串)。
不管什么時(shí)候,只要你更新了元素的值,那 KO都會(huì)將view model對(duì)應(yīng)的屬性值自動(dòng)更新。默認(rèn)情況下當(dāng)用戶離開焦點(diǎn)(例如onchange事件)的時(shí)候,KO才更新這個(gè)值,但是你可以通過第2個(gè)參數(shù)valueUpdate來特別指定改變值的時(shí)機(jī)。
其它參數(shù)
valueUpdate
如果你使用valueUpdate參數(shù),那就是意味著KO將使用自定義的事件而不是默認(rèn)的離開焦點(diǎn)事件。下面是一些最常用的選項(xiàng):
“change”(默認(rèn)值)- 當(dāng)失去焦點(diǎn)的時(shí)候更新view model的值,或者是
“keyup”– 當(dāng)用戶敲完一個(gè)字符以后立即更新view model。
“keypress”– 當(dāng)用戶正在敲一個(gè)字符但沒有釋放鍵盤的時(shí)候就立即更新view model。不像 keyup,這個(gè)更新和keydown是一樣的。
“afterkeydown”– 當(dāng)用戶開始輸入字符的時(shí)候就更新view model。主要是捕獲瀏覽器的keydown事件或異步handle事件。
上述這些選項(xiàng),如果你想讓你的view model進(jìn)行實(shí)時(shí)更新,使用“afterkeydown”是最好的選擇。
例子:
Your value:
You have typed:
- var viewModel = {
- someValue: ko.observable("edit me")
- };
注1:綁定下拉菜單drop-down list(例如SELECT)
Knockout對(duì)下拉菜單drop-down list綁定有一個(gè)特殊的支持,那就是在讀取和寫入綁定的時(shí)候,這個(gè)值可以是任意JavaScript對(duì)象,而不必非得是字符串。在你讓你用戶選擇一組model對(duì)象的時(shí)候非常有用。具體例子,參考o(jì)ptions綁定。
類似,如果你想創(chuàng)建一個(gè)multi-select list,參考selectedOptions綁定。
注2:更新observable和non-observable屬性值
如果你用value綁定將你的表單元素和你的observable屬性關(guān)聯(lián)起來,KO設(shè)置的2-way的雙向綁定,任何一方改變都會(huì)更新另外一方的值。
但是,如果你的元素綁定的是一個(gè)non-observable屬性(例如是一個(gè)原始的字符串或者JavaScript表達(dá)式) ,KO會(huì)這樣執(zhí)行:
◆ 如果你綁定的non-observable屬性是簡單對(duì)象,例如一個(gè)常見的屬性值,KO會(huì)設(shè)置這個(gè)值為form表單元素的初始值,如果你改變form表單元素的值,KO會(huì)將值重新寫回到view mode的這個(gè)屬性。但當(dāng)這個(gè)屬性自己改變的時(shí)候,元素卻不會(huì)再變化了(因?yàn)椴皇莖bservable的),所以它僅僅是1-way綁定。
◆ 如果你綁定的non-observable屬性是復(fù)雜對(duì)象,例如復(fù)雜的JavaScript 表達(dá)式或者子屬性,KO也會(huì)設(shè)置這個(gè)值為form表單元素的初始值,但是改變form表單元素的值的時(shí)候,KO不會(huì)再寫會(huì)view model屬性,這種情況叫one-time-only value setter,不是真正的綁定。
例子:
First value:
Second value:
Third value:
- var viewModel = {
- firstValue: ko.observable("hello"), // Observable
- secondValue: "hello, again"http:// Not observable
- };
- ko.applyBindings(viewModel);
依賴性
除KO核心類庫外,無依賴。
13 checked 綁定
目的
checked綁定是關(guān)聯(lián)到checkable的form表單控件到view model上 - 例如checkbox()或者radio button() 。當(dāng)用戶check關(guān)聯(lián)的form表單控件的時(shí)候,view model對(duì)應(yīng)的值也會(huì)自動(dòng)更新,相反,如果view model的值改變了,那控件元素的check/uncheck狀態(tài)也會(huì)跟著改變。
注:對(duì)text box,drop-down list和所有non-checkable的form表單控件,用value綁定來讀取和寫入是該元素的值,而不是checked綁定。
例子
Send me spam:
- var viewModel = {
- wantsSpam: ko.observable(true) // Initially checked
- };
- // ... then later ...
- viewModel.wantsSpam(false); // The checkbox becomes unchecked
Checkbox關(guān)聯(lián)到數(shù)組
Send me spam:
- Preferred flavors of spam:
Cherry Almond Monosodium Glutamate- var viewModel = {
- wantsSpam: ko.observable(true),
- spamFlavors: ko.observableArray(["cherry", "almond"]) // Initially checks the Cherry and Almond checkboxes
- };
- // ... then later ...
- viewModel.spamFlavors.push("msg"); // Now additionally checks the Monosodium Glutamate checkbox
添加radio button
Send me spam:
- Preferred flavor of spam:
Cherry Almond Monosodium Glutamate- var viewModel = {
- wantsSpam: ko.observable(true),
- spamFlavor: ko.observable("almond") // Initially selects only the Almond radio button
- };
- // ... then later ...
- viewModel.spamFlavor("msg"); // Now only Monosodium Glutamate is checked
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/cdgdjeo.html


咨詢
建站咨詢
