Knockout中Observables有什么用

這篇文章主要介紹了Knockout中Observables有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1 創(chuàng)建帶有監(jiān)控屬性的view model

Observables

Knockout是在下面三個核心功能是建立起來的:

◆ 監(jiān)控屬性(Observables)和依賴跟蹤(Dependency tracking)

◆ 聲明式綁定(Declarative bindings)

◆ 模板(Templating)

這一節(jié),你講學到3個功能中的***個。 在這之前, 我們來解釋一下MVVM模式和view model的概念。

MVVM and View Models

Model-View-View Model (MVVM) 是一種創(chuàng)建用戶界面的設(shè)計模式。 描述的是如何將復(fù)雜的UI用戶界面分成3個部分:

◆ model: 你程序里存儲的數(shù)據(jù)。這個數(shù)據(jù)包括對象和業(yè)務(wù)操作(例如:銀子賬戶可以完成轉(zhuǎn)賬功能), 并且獨立于任何UI。使用KO的時候,通常說是向服務(wù)器調(diào)用Ajax讀寫這個存儲的模型數(shù)據(jù)。

◆ view model: 在UI上,純code描述的數(shù)據(jù)以及操作。例如,如果你實現(xiàn)列表編輯,你的view model應(yīng)該是一個包含列表項items的對象和暴露的add/remove列表項(item)的操作方法。

注意這不是UI本身:它不包含任何按鈕的概念或者顯示風格。它也不是持續(xù)數(shù)據(jù)模型 – 包含用戶正在使用的未保存數(shù)據(jù)。使用KO的時候,你的view models是不包含任何HTML知識的純JavaScript 對象。保持view model抽象可以保持簡單,以便你能管理更復(fù)雜的行為。

◆ view: 一個可見的,交互式的,表示view model狀態(tài)的UI。 從view model顯示數(shù)據(jù),發(fā)送命令到view model(例如:當用戶click按鈕的時候) ,任何view model狀態(tài)改變的時候更新。

使用KO的時候,你的view就是你帶有綁定信息的HTML文檔,這些聲明式的綁定管理到你的view model上。或者你可以使用模板從你的view model獲取數(shù)據(jù)生成HTML。

創(chuàng)建一個view model,只需要聲明任意的JavaScript object。例如:

var myViewModel = {      personName: 'Bob',      personAge: 123  };

你可以為view model創(chuàng)建一個聲明式綁定的簡單view。例如:下面的代碼顯示personName 值:

The name is <span data-bind="text: personName"></span>

Activating Knockout

data-bind屬性盡快好用但它不是HTML的原生屬性(它嚴格遵從HTML5語法, 雖然HTML4驗證器提示有不可識別的屬性但依然可用)。由于瀏覽器不識別它是什么意思,所以你需要激活Knockout 來讓他起作用。

激活Knockout,需要添加如下的 <script> 代碼塊:

ko.applyBindings(myViewModel);

你可以將這個代碼塊放在HTML底部,或者放在jQuery的$函數(shù)或者ready 函數(shù)里,然后放在頁面上面, 最終生成結(jié)果就是如下的HTML代碼:

The name is <span>Bob</span>

你可能奇怪ko.applyBindings使用的是什么樣的參數(shù),

◆ ***個參數(shù)是你想用于聲明式綁定

◆ 第二個參數(shù)(可選),可以聲明成使用data-bind的HTML元素或者容器。例如, ko.applyBindings(myViewModel, document.getElementById('someElementId'))。它的現(xiàn)在是只有作為someElementId 的元素和子元素才能激活KO功能。 好處是你可以在同一個頁面聲明多個view model,用來區(qū)分區(qū)域。

Observables

現(xiàn)在已經(jīng)知道如何創(chuàng)建一個簡單的view model并且通過binding顯示它的屬性了。但是KO一個重要的功能是當你的view model改變的時候能自動更新你的界面。當你的view model部分改變的時候KO是如何知道的呢?答案是:你需要將你的model屬性聲明成observable的, 因為它是非常特殊的JavaScript objects,能夠通知訂閱者它的改變以及自動探測到相關(guān)的依賴。

例如:將上述例子的view model改成如下代碼:

var myViewModel = {      personName: ko.observable('Bob'),      personAge: ko.observable(123)  };

你根本不需要修改view &ndash; 所有的data-bind語法依然工作,不同的是他能監(jiān)控到變化,當值改變時,view會自動更新。

監(jiān)控屬性(observables)的讀和寫

不是所有的瀏覽器都支持JavaScript的 getters and setters (比如IE),,所以為了兼容性,使用ko.observable監(jiān)控的對象都是真實的function函數(shù)。

◆  讀取監(jiān)控屬性(observable)的值,只需要直接調(diào)用監(jiān)控屬性(observable)(不需要參數(shù)),例如myViewModel.personName() 將返回'Bob', myViewModel.personAge() 將返回 123。

◆  寫一個新值到監(jiān)控屬性(observable)上,調(diào)用這個observable屬性并當新值作為參數(shù)。例如:調(diào)用 myViewModel.personName('Mary') 將更新name值為'Mary'。

◆  給一個model對象的多個屬性寫入新值,你可以使用鏈式語法。例如: myViewModel.personName('Mary').personAge(50) 將會將name更新為 'Mary' 并且 將age更新為 50.

監(jiān)控屬性(observables)的特征就是監(jiān)控(observed),例如其它代碼可以說我需要得到對象變化的通知,所以KO內(nèi)部有很多內(nèi)置的綁定語法。所以如果你的代碼寫成data-bind="text: personName", text綁定注冊到自身,一旦personName的值改變,它就能得到通知。

當然調(diào)用myViewModel.personName('Mary')改變name的值,text綁定將自動更新這個新值到相應(yīng)的DOM元素上。這就是如何將view model的改變傳播到view上的。

監(jiān)控屬性(Observables)的顯式訂閱

通常情況下,你不用手工訂閱,所以新手可以忽略此小節(jié)。高級用戶,如果你要注冊自己的訂閱到監(jiān)控屬性(observables),你可以調(diào)用它的subscribe 函數(shù)。例如:

myViewModel.personName.subscribe(function (newValue) {      alert("The person's new name is " + newValue);  });

這個subscribe 函數(shù)在內(nèi)部很多地方都用到的。你也可以終止自己的訂閱:首先得到你的訂閱,然后調(diào)用這個對象的dispose函數(shù),例如:

var subscription = myViewModel.personName.subscribe(function (newValue) { /* do stuff */ });  // ...then later...  subscription.dispose(); // I no longer want notifications

大多數(shù)情況下,你不需要做這些,因為內(nèi)置的綁定和模板系統(tǒng)已經(jīng)幫你做好很多事情了,可以直接使用它們。

2 使用依賴監(jiān)控屬性(Dependent Observables)

如果你已經(jīng)有了監(jiān)控屬性firstName和lastName,你想顯示全稱怎么辦? 這就需要用到依賴監(jiān)控屬性了 &ndash; 這些函數(shù)是一個或多個監(jiān)控屬性, 如果他們的依賴對象改變,他們會自動跟著改變。

例如,下面的view model,

var viewModel = {      firstName: ko.observable('Bob'),      lastName: ko.observable('Smith')  };

&hellip; 你可以添加一個依賴監(jiān)控屬性來返回姓名全稱:

viewModel.fullName = ko.dependentObservable(function () {      return this.firstName() + " " + this.lastName();  }, viewModel);

并且綁定到UI的元素上,例如:

The name is <span data-bind="text: fullName"></span>

&hellip; 不管firstName還是lastName改變,全稱fullName都會自動更新(不管誰改變,執(zhí)行函數(shù)都會調(diào)用一次,不管改變成什么,他的值都會更新到UI或者其他依賴監(jiān)控屬性上)。

管理&lsquo;this&rsquo;

新手可忽略此小節(jié),你只需要安裝上面例子中的代碼模式寫就行了,無需知道/關(guān)注這個this。

你可能疑惑ko.dependentObservable的第二個參數(shù)是做什么用的(上面的例子中我傳的是viewModel), 它是聲明執(zhí)行依賴監(jiān)控屬性的this用的。 沒有它,你不能引用到this.firstName() 和this.lastName()。 老練的JavaScript 開發(fā)人員不覺得this怎么樣,但是如果你不熟悉JavaScript,那就對它就會很陌生。(C#和Java需要不需要為set一個值為設(shè)置this,但是JavaScript 需要,因為默認情況下他們的函數(shù)自身不是任何對象的一部分)。

不幸的是, JavaScript 對象沒有任何辦法能引用他們自身,所以你需要通過myViewModelObject.myDependentObservable = ... 的形式添加依賴監(jiān)控屬性到view model對象上。 你不能直接在view model里聲明他們,換句話說,你不能寫成下面這樣:

var viewModel = {      myDependentObservable: ko.dependentObservable(function() {          ...      }, /* can't refer to viewModel from here, so this doesn't work */)  }

&hellip; 相反你必須寫成如下這樣:

var viewModel = {      // Add other properties here as you wish  };   viewModel.myDependentObservable = ko.dependentObservable(function() {      ...  }, viewModel); // This is OK

只要你知道期望什么,它確實不是個問題。

依賴鏈

理所當然,如果你想你可以創(chuàng)建一個依賴監(jiān)控屬性的鏈。例如:

◆ 監(jiān)控屬性items表述一組列表項

◆ 監(jiān)控屬性selectedIndexes保存著被用戶選上的列表項的索引

◆ 依賴監(jiān)控屬性selectedItems 返回的是selectedIndexes 對應(yīng)的列表項數(shù)組

◆ 另一個依賴監(jiān)控屬性返回的true或false依賴于 selectedItems 的各個列表項是否包含一些屬性(例如,是否新的或者還未保存的)。一些UI element(像按鈕的啟用/禁用)的狀態(tài)取決于這個值)。

然后,items或者selectedIndexes 的改變將會影響到所有依賴監(jiān)控屬性的鏈,所有綁定這些屬性的UI元素都會自動更新。多么整齊與優(yōu)雅!

可寫的依賴監(jiān)控屬性

新手可忽略此小節(jié),可寫依賴監(jiān)控屬性真的是太advanced了,而且大部分情況下都用不到。

正如所學到的,依賴監(jiān)控屬性是通過計算其它的監(jiān)控屬性而得到的。感覺是依賴監(jiān)控屬性正常情況下應(yīng)該是只讀的。那么,有可能讓依賴監(jiān)控屬性支持可寫么?你只需要聲明自己的callback函數(shù)然后利用寫入的值再處理一下相應(yīng)的邏輯即可。

你可以像使用普通的監(jiān)控屬性一樣使用依賴監(jiān)控屬性 &ndash; 數(shù)據(jù)雙向綁定到DOM元素上,并且通過自定義的邏輯攔截所有的讀和寫操作。這是非常牛逼的特性并且可以在大范圍內(nèi)使用。

例1:分解用戶的輸入

返回到經(jīng)典的“first name + last name = full name” 例子上,你可以讓事情調(diào)回來看: 讓依賴監(jiān)控屬性fullName可寫,讓用戶直接輸入姓名全稱,然后輸入的值將被解析并映射寫入到基本的監(jiān)控屬性firstName和lastName上:

var viewModel = {      firstName: ko.observable("Planet"),      lastName: ko.observable("Earth")  };   viewModel.fullName = ko.dependentObservable({       read: function () {          return this.firstName() + " " + this.lastName();      },       write: function (value) {          var lastSpacePos = value.lastIndexOf(" ");          if (lastSpacePos > 0) { // Ignore values with no space character              this.firstName(value.substring(0, lastSpacePos)); // Update "firstName"              this.lastName(value.substring(lastSpacePos + 1)); // Update "lastName"          }      },      owner: viewModel  });

這個例子里,寫操作的callback接受寫入的值,把值分離出來,分別寫入到“firstName”和“l(fā)astName”上。 你可以像普通情況一樣將這個view model綁定到DOM元素上,如下:

<p>First name: <span data-bind="text: firstName"></span></p> <p>Last name: <span data-bind="text: lastName"></span></p> <h3>Hello, <input data-bind="value: fullName"/>!</h3>

這是一個Hello World 例子的反例子,姓和名都不可編輯,相反姓和名組成的姓名全稱卻是可編輯的。

上面的view model演示的是通過一個簡單的參數(shù)來初始化依賴監(jiān)控屬性。你可以給下面的屬性傳入任何JavaScript對象:

◆ read &mdash; 必選,一個用來執(zhí)行取得依賴監(jiān)控屬性當前值的函數(shù)。

◆ write &mdash; 可選,如果聲明將使你的依賴監(jiān)控屬性可寫,別的代碼如果這個可寫功能寫入新值,通過自定義邏輯將值再寫入各個基礎(chǔ)的監(jiān)控屬性上。

◆ owner &mdash; 可選,如果聲明,它就是KO調(diào)用read或write的callback時用到的this。查看“管理this”獲取更新信息。

例2:Value轉(zhuǎn)換器

有時候你可能需要顯示一些不同格式的數(shù)據(jù),從基礎(chǔ)的數(shù)據(jù)轉(zhuǎn)化成顯示格式。比如,你存儲價格為float類型,但是允許用戶編輯的字段需要支持貨幣單位和小數(shù)點。你可以用可寫的依賴監(jiān)控屬性來實現(xiàn),然后解析傳入的數(shù)據(jù)到基本 float類型里:

viewModel.formattedPrice = ko.dependentObservable({       read: function () {          return "$" + this.price().toFixed(2);      },       write: function (value) {          // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable          value = parseFloat(value.replace(/[^\.\d]/g, ""));          this.price(isNaN(value) ? 0 : value); // Write to underlying storage      },      owner: viewModel  });

然后我們綁定formattedPrice到text box上:

<p>Enter bid price: <input data-bind="value: formattedPrice"/></p>

所以,不管用戶什么時候輸入新價格,輸入什么格式,text box里會自動更新為帶有2位小數(shù)點和貨幣符號的數(shù)值。這樣用戶可以看到你的程序有多聰明,來告訴用戶只能輸入2位小數(shù),否則的話自動刪除多余的位數(shù),當然也不能輸入負數(shù),因為write的callback函數(shù)會自動刪除負號。

例3:過濾并驗證用戶輸入

例1展示的是寫操作過濾的功能,如果你寫的值不符合條件的話將不會被寫入,忽略所有不包括空格的值。

再多走一步,你可以聲明一個監(jiān)控屬性isValid 來表示***一次寫入是否合法,然后根據(jù)真假值顯示相應(yīng)的提示信息。稍后仔細介紹,先參考如下代碼:

var viewModel = {      acceptedNumericValue: ko.observable(123),      lastInputWasValid: ko.observable(true)  };   viewModel.attemptedValue = ko.dependentObservable({      read: viewModel.acceptedNumericValue,      write: function (value) {          if (isNaN(value))              this.lastInputWasValid(false);          else {              this.lastInputWasValid(true);              this.acceptedNumericValue(value); // Write to underlying storage          }      },      owner: viewModel  });

&hellip; 按照如下格式聲明綁定元素:

<p>Enter a numeric value: <input data-bind="value: attemptedValue"/></p> <div data-bind="visible: !lastInputWasValid()">That's not a number!</div>

現(xiàn)在,acceptedNumericValue 將只接受數(shù)字,其它任何輸入的值都會觸發(fā)顯示驗證信息,而會更新acceptedNumericValue。

備注:上面的例子顯得殺傷力太強了,更簡單的方式是在<input>上使用jQuery Validation和number class。Knockout可以和jQuery Validation一起很好的使用,參考例子:grid editor 。當然,上面的例子依然展示了一個如何使用自定義邏輯進行過濾和驗證數(shù)據(jù),如果驗證很復(fù)雜而jQuery Validation很難使用的話,你就可以用它。

依賴跟蹤如何工作的

新手沒必要知道太清楚,但是高級開發(fā)人員可以需要知道為什么依賴監(jiān)控屬性能夠自動跟蹤并且自動更新UI&hellip;

事實上,非常簡單,甚至說可愛。跟蹤的邏輯是這樣的:

◆ 當你聲明一個依賴監(jiān)控屬性的時候,KO會立即調(diào)用執(zhí)行函數(shù)并且獲取初始化值。

◆ 當你的執(zhí)行函數(shù)運行的時候,KO會把所有需要依賴的依賴屬性(或者監(jiān)控依賴屬性)都記錄到一個Log列表里。

◆ 執(zhí)行函數(shù)結(jié)束以后,KO會向所有Log里需要依賴到的對象進行訂閱。訂閱的callback函數(shù)是重新運行你的執(zhí)行函數(shù)。然后回頭重新執(zhí)行上面的***步操作(并且注銷不再使用的訂閱)。

◆ ***KO會通知上游所有訂閱它的訂閱者,告訴它們我已經(jīng)設(shè)置了新值。

所有說,KO不僅僅是在***次執(zhí)行函數(shù)執(zhí)行時候探測你的依賴項,每次它都會探測。舉例來說,你的依賴屬性可以是動態(tài)的:依賴屬性A代表你是否依賴于依賴屬性B或者C,這時候只有當A或者你當前的選擇B或者C改變的時候執(zhí)行函數(shù)才重新執(zhí)行。你不需要再聲明其它的依賴:運行時會自動探測到的。

另外一個技巧是:一個模板輸出的綁定是依賴監(jiān)控屬性的簡單實現(xiàn),如果模板讀取一個監(jiān)控屬性的值,那模板綁定就會自動變成依賴監(jiān)控屬性依賴于那個監(jiān)控屬性,監(jiān)控屬性一旦改變,模板綁定的依賴監(jiān)控屬性就會自動執(zhí)行。嵌套的模板也是自動的:如果模板X render模板 Y,并且Y需要顯示監(jiān)控屬性Z的值,當Z改變的時候,由于只有Y依賴它,所以只有Y這部分進行了重新繪制(render)。

3 使用observable數(shù)組

如果你要探測和響應(yīng)一個對象的變化,你應(yīng)該用observables。如果你需要探測和響應(yīng)一個集合對象的變化,你應(yīng)該用observableArray 。在很多場景下,它都非常有用,比如你要在UI上需要顯示/編輯的一個列表數(shù)據(jù)集合,然后對集合進行添加和刪除。

var myObservableArray = ko.observableArray();    // Initially an empty array  myObservableArray.push('Some value');            // Adds the value and notifies observers

關(guān)鍵點:監(jiān)控數(shù)組跟蹤的是數(shù)組里的對象,而不是這些對象自身的狀態(tài)。

簡單說,將一對象放在observableArray 里不會使這個對象本身的屬性變化可監(jiān)控的。當然你自己也可以聲明這個對象的屬性為observable的,但它就成了一個依賴監(jiān)控對象了。一個observableArray 僅僅監(jiān)控他擁有的對象,并在這些對象添加或者刪除的時候發(fā)出通知。

預(yù)加載一個監(jiān)控數(shù)組observableArray

如果你想讓你的監(jiān)控數(shù)組在開始的時候就有一些初始值,那么在聲明的時候,你可以在構(gòu)造器里加入這些初始對象。例如:

// This observable array initially contains three objects  var anotherObservableArray = ko.observableArray([      { name: "Bungle", type: "Bear" },      { name: "George", type: "Hippo" },      { name: "Zippy", type: "Unknown" }  ]);

從observableArray里讀取信息

一個observableArray其實就是一個observable的監(jiān)控對象,只不過他的值是一個數(shù)組(observableArray還加了很多其他特性,稍后介紹)。所以你可以像獲取普通的observable的值一樣,只需要調(diào)用無參函數(shù)就可以獲取自身的值了。 例如,你可以像下面這樣獲取它的值:

alert('The length of the array is ' + myObservableArray().length);  alert('The first element is ' + myObservableArray()[0]);

理論上你可以使用任何原生的JavaScript數(shù)組函數(shù)來操作這些數(shù)組,但是KO提供了更好的功能等價函數(shù),他們非常有用是因為:

◆ 兼容所有瀏覽器。(例如indexOf不能在IE8和早期版本上使用,但KO自己的indexOf 可以在所有瀏覽器上使用)

◆ 在數(shù)組操作函數(shù)方面(例如push和splice),KO自己的方式可以自動觸發(fā)依賴跟蹤,并且通知所有的訂閱者它的變化,然后讓UI界面也相應(yīng)的自動更新。

◆ 語法更方便,調(diào)用KO的push方法,只需要這樣寫:myObservableArray.push(...)。 比如原生數(shù)組的myObservableArray().push(...)好用多了。

下面講解的均是observableArray的讀取和寫入的相關(guān)函數(shù)。

indexOf

indexOf 函數(shù)返回的是***個等于你參數(shù)數(shù)組項的索引。例如:myObservableArray.indexOf('Blah')將返回以0為***個索引的***個等于Blah的數(shù)組項的索引。如果沒有找到相等的,將返回-1。

slice

slice函數(shù)是observableArray相對于JavaScript 原生函數(shù)slice的等價函數(shù)(返回給定的從開始索引到結(jié)束索引之間所有的對象集合)。 調(diào)用myObservableArray.slice(...)等價于調(diào)用JavaScript原生函數(shù)(例如:myObservableArray().slice(...))。

操作observableArray

observableArray 展現(xiàn)的是數(shù)組對象相似的函數(shù)并通知訂閱者的功能。

pop, push, shift, unshift, reverse, sort, splice

所有這些函數(shù)都是和JavaScript數(shù)組原生函數(shù)等價的,唯一不同的數(shù)組改變可以通知訂閱者:

myObservableArray.push('Some new value') 在數(shù)組末尾添加一個新項

myObservableArray.pop() 刪除數(shù)組***一個項并返回該項

myObservableArray.unshift('Some new value') 在數(shù)組頭部添加一個項

myObservableArray.shift() 刪除數(shù)組頭部***項并返回該項

myObservableArray.reverse() 翻轉(zhuǎn)整個數(shù)組的順序

myObservableArray.sort() 給數(shù)組排序

默認情況下,是按照字符排序(如果是字符)或者數(shù)字排序(如果是數(shù)字)。

你可以排序傳入一個排序函數(shù)進行排序,該排序函數(shù)需要接受2個參數(shù)(代表該數(shù)組里需要比較的項),如果***個項小于第二個項,返回-1,大于則返回1,等于返回0。例如:用lastname給person排序,你可以這樣寫:myObservableArray.sort (function (left, right) {return left.lastName == right.lastName? 0: (left.lastName < right.lastName? -1: 1) })

myObservableArray.splice() 刪除指定開始索引和指定數(shù)目的數(shù)組對象元素。例如myObservableArray.splice(1, 3) 從索引1開始刪除3個元素(第2,3,4個元素)然后將這些元素作為一個數(shù)組對象返回。

更多observableArray 函數(shù)的信息,請參考等價的JavaScript數(shù)組標準函數(shù)。

remove和removeAll

observableArray 添加了一些JavaScript數(shù)組默認沒有但非常有用的函數(shù):

myObservableArray.remove(someItem) 刪除所有等于someItem的元素并將被刪除元素作為一個數(shù)組返回

myObservableArray.remove(function(item) { return item.age < 18 }) 刪除所有age屬性小于18的元素并將被刪除元素作為一個數(shù)組返回

myObservableArray.removeAll(['Chad', 132, undefined]) 刪除所有等于'Chad', 123, or undefined的元素并將被刪除元素作為一個數(shù)組返回

destroy和destroyAll(注:通常只和和Ruby on Rails開發(fā)者有關(guān))

destroy和destroyAll函數(shù)是為Ruby on Rails開發(fā)者方便使用為開發(fā)的:

myObservableArray.destroy(someItem) 找出所有等于someItem的元素并給他們添加一個屬性_destroy,并賦值為true

myObservableArray.destroy(function(someItem) { return someItem.age < 18 }) 找出所有age屬性小于18的元素并給他們添加一個屬性_destroy,并賦值為true

myObservableArray.destroyAll(['Chad', 132, undefined]) 找出所有等于'Chad', 123, 或undefined 的元素并給他們添加一個屬性_destroy,并賦值為true

那么,_destroy是做什么用的?正如我提到的,這只是為Rails 開發(fā)者準備的。在Rails 開發(fā)過程中,如果你傳入一個JSON對象,Rails 框架會自動轉(zhuǎn)換成ActiveRecord對象并且保存到數(shù)據(jù)庫。Rails 框架知道哪些對象以及在數(shù)據(jù)庫中存在,哪些需要添加或更新, 標記_destroy為true就是告訴框架刪除這條記錄。

注意的是:在KO render一個foreach模板的時候,會自動隱藏帶有_destroy屬性并且值為true的元素。所以如果你的“delete”按鈕調(diào)用destroy(someItem) 方法的話,UI界面上的相對應(yīng)的元素將自動隱藏,然后等你提交這個JSON對象到Rails上的時候,這個元素項將從數(shù)據(jù)庫刪除(同時其它的元素項將正常的插入或者更新)。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Knockout中Observables有什么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

文章題目:Knockout中Observables有什么用
網(wǎng)頁URL:http://bm7419.com/article40/jddpeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、ChatGPT品牌網(wǎng)站建設(shè)服務(wù)器托管、網(wǎng)站制作定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司