深入淺析AngularJS和DataModel
AngularJS 簡(jiǎn)介
AngularJS 是一個(gè) JavaScript 框架。它可通過(guò) <script> 標(biāo)簽添加到 HTML 頁(yè)面。
AngularJS 通過(guò) 指令 擴(kuò)展了 HTML,且通過(guò) 表達(dá)式 綁定數(shù)據(jù)到 HTML。
什么是 AngularJS?
AngularJS 使得開(kāi)發(fā)現(xiàn)代的單一頁(yè)面應(yīng)用程序(SPAs:Single Page Applications)變得更加容易。
AngularJS 把應(yīng)用程序數(shù)據(jù)綁定到 HTML 元素。
AngularJS 可以克隆和重復(fù) HTML 元素。
AngularJS 可以隱藏和顯示 HTML 元素。
AngularJS 可以在 HTML 元素"背后"添加代碼。
AngularJS 支持輸入驗(yàn)證。
通常,在AngularJS中使用JSON作為存儲(chǔ)數(shù)據(jù)的模型。我們可能這樣在controller中寫(xiě)model:
app.controller('BookController',['$scope',function($scope){
$scope.book = {
id:1,
name:'',
author:'',
stores:[
{id:1, name:'', quantity:2},
{id:2, name:'', quantity:2},
...
]
};
}])
在視圖中也許這樣用到這個(gè)model:
<div ng-controller="BookController"> <span ng-bind="book.id"></span> <input type="text" ng-model="book.name"/> <input type="text" ng-model="book.author"/> </div>
當(dāng)我們需要從服務(wù)端獲取數(shù)據(jù)的時(shí)候,可能這樣寫(xiě):
app.controller('BookController',['$scope', '$http', function($scope, $http){
var bookId = 1;
$http.get('api/books'+bookId).success(function(bookData){
$scope.book = bookData;
})
$scope.deleteBook = function(){
$http.delete('api/books/' + bookId);
}
$scope.updateBook = function(){
$http.put('api/books/'+bookId, $scope.book);
}
$scope.getBookImageUrl = function(width, height){
return 'our/iamge/service' +bookId + '/width/height';
}
$scope.isAvailable = function(){
if(!$scope.book.stores || $scope.book.stores.length === 0){
return false;
}
reutrn $scope.book.stores.some(function(store){
return store.quantity > 0;
})
}
}])
在視圖中可能這樣使用:
<div ng-controller="BookController">
<div ng-style="{backgroundImage: 'url('+getBookImageUrl(100,100)+')'}"></div>
<span ng-bind="book.id"></span?
<input type="text" ng-model="book.name"/>
<input type="text" ng-model="book.author"/>
is available: <span ng-bind="isAvailable() ? 'Yes' : 'No'"></span>
<button ng-click="deleteBook()">Delete</button>
<button ng-click="updateBook">Update</button>
</div>
以上,JSON格式的model只能在BookController中使用,如何在其他controller中也可以使用呢?
--通過(guò)factory方式
app.factory('Book', ['$http', function($http){
function Book(bookData){
if(bookData){
this.setData(bookData);
}
}
Book.prototype = {
setData: function(bookData){
angular.extend(this, bookData);
},
load: function(id){
var scope = this;
$http.get('api/books/' + bookId).success(function(bookData){
scope.setData(bookData);
})
},
delete: function(bookId){
$http.delete('api/books/' + bookId);
},
update: function(bookId){
$http.put('api/books/' + bookId, this);
},
getImageUrl: function(width, height){
return 'our/image/service/' + this.book.id + '/' + width + '/' + height;
},
isAvailable: funciton(){
if(!this.book.stores || this.book.stores.length === 0) {
return false;
}
return this.book.stores.some(function(store){
return store.quantity > 0;
})
}
}
return Book;
}])
以上,通過(guò)factory的方式創(chuàng)建了類(lèi)似Book的一個(gè)Data Model,現(xiàn)在可以注入到controller中去了。
app.controller('BookController', ['$scope', 'Book', function($scope, Book){
$scope.book = new Book();
$scope.book.load(1);
}])
在視圖中也會(huì)有相應(yīng)的變化。
<div ng-controller="BookController">
<div ng-style="{backgroundImage: 'url(' + book.getImageUrl(100, 100) + ')'}"></div>
<span ng-bind="book.id"></span>
<input type="text" ng-model="book.name"/>
<input type="text" ng-model="book.author"/>
is abailble: <span ng-bind="book.isAvailabe() ? 'Yes' : 'No'"></span>
<button ng-click="book.delete()">Delete</button>
<button ng-click="book.update()">Update</button>
</div>
以上,多個(gè)controller可以使用同一個(gè)有關(guān)book的Data Model了,如果多個(gè)controller處理同一個(gè)有關(guān)book的Data Model呢?
app.factory('booksManager', ['$http', '$q', 'Book', function($http. $q, Book){
var booksManager = {
_pool: {},
_retrieveInstance: function(bookId, bookData){
var instance = this._pool[bookId];
if(instance){
instance.setData(bookData);
} else {
instance = new Book(bookData);
this._pool[bookId] = instance;
}
return instance;
},
_seach: function(bookId){
reutrn this_.pool[bookId];
},
_load: function(bookId, deferred){
var scope = this;
$http.get('api/books/' + bookId)
.success(funciton(bookData){
var book = scope._retrieveInstance(bookData.id, bookData);
deferred.resolve(book);
})
.error(function(){
deferred.reject();
})
},
getBook: function(bookId){
var deferred = $q.defer();
var book = this._search(bookId);
if(book){
deferred.resove(book);
} else {
this._load(bookId, deferred);
}
return deferred.promise;
},
loadAllBooks: function(){
var deferred = $q.defer();
var scope = this;
$http.get('api/books')
.success(function(booksArray){
var books = [];
booksArray.forEach(function(bookData){
var book = scope.l_retrieveInstance(bookData.id, bookData);
books.push(book);
});
deferred.resolve(books);
})
.error(function(){
deferred.reject();
});
return deferred.promise;
},
setBook: function(bookData){
var scope = this;
var book = this._search(bookData.id);
if(book){
book.setData(bookData);
} else {
book = scope._retrieveInstance(bookData);
}
return book;
}
};
return booksManager;
}])
Book服務(wù)去掉load方法。
app.factory('Book', ['$http', function($http) {
function Book(bookData) {
if (bookData) {
this.setData(bookData):
}
// Some other initializations related to book
};
Book.prototype = {
setData: function(bookData) {
angular.extend(this, bookData);
},
delete: function() {
$http.delete('ourserver/books/' + bookId);
},
update: function() {
$http.put('ourserver/books/' + bookId, this);
},
getImageUrl: function(width, height) {
return 'our/image/service/' + this.book.id + '/width/height';
},
isAvailable: function() {
if (!this.book.stores || this.book.stores.length === 0) {
return false;
}
return this.book.stores.some(function(store) {
return store.quantity > 0;
});
}
};
return Book;
}]);
現(xiàn)在,多個(gè)controller可以使用同一個(gè)booksManager服務(wù)。
app.controller('EditableBookController',['$scope', 'booksManager', function($scope, booksManager){
booksManager.getBook(1).then(function(book){
$scope.book = book;
})
}])
.controller('BooksListController',['$scope', 'booksManager', function($scope, booksManager){
booksManager.loadAllBooks().then(function(books){
$scope.books = books;
})
}])
- angularjs學(xué)習(xí)筆記之雙向數(shù)據(jù)綁定
- 實(shí)例剖析AngularJS框架中數(shù)據(jù)的雙向綁定運(yùn)用
- 深入學(xué)習(xí)AngularJS中數(shù)據(jù)的雙向綁定機(jī)制
- 詳解JavaScript的AngularJS框架中的作用域與數(shù)據(jù)綁定
- angularjs自定義ng-model標(biāo)簽的屬性
- AngularJs 彈出模態(tài)框(model)
- angularjs在ng-repeat中使用ng-model遇到的問(wèn)題
- AngularJS實(shí)現(xiàn)Model緩存的方式
- AngularJS基礎(chǔ) ng-model-options 指令簡(jiǎn)單示例
- AngularJS實(shí)踐之使用NgModelController進(jìn)行數(shù)據(jù)綁定
相關(guān)文章
使用typescript開(kāi)發(fā)angular模塊并發(fā)布npm包
本篇文章主要介紹了使用typescript開(kāi)發(fā)angular模塊并發(fā)布npm包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
解決angular的post請(qǐng)求后SpringMVC后臺(tái)接收不到參數(shù)值問(wèn)題的方法
這篇文章主要介紹了解決angular的post請(qǐng)求后SpringMVC后臺(tái)接收不到參數(shù)值問(wèn)題的方法,感興趣的小伙伴們可以參考一下2015-12-12
angular+ionic返回上一頁(yè)并刷新頁(yè)面
這篇文章主要介紹了angular+ionic返回上一頁(yè)并刷新頁(yè)面,需要的朋友可以參考下2017-08-08
Angular2使用Angular-CLI快速搭建工程(二)
這篇文章主要介紹了Angular2使用Angular-CLI快速搭建工程(二),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Angular2實(shí)現(xiàn)的秒表及改良版示例
這篇文章主要介紹了Angular2實(shí)現(xiàn)的秒表及改良版,結(jié)合實(shí)例形式分析 Angular2實(shí)現(xiàn)秒表功能的原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-05-05
angularJs在多個(gè)控制器中共享服務(wù)數(shù)據(jù)的方法
今天小編就為大家分享一篇angularJs在多個(gè)控制器中共享服務(wù)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Spartacus CMS Feature selector的實(shí)現(xiàn)解析
這篇文章主要為大家介紹了Spartacus CMS Feature selector的實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
詳解AngularJS ui-sref的簡(jiǎn)單使用
本篇文章主要介紹了詳解AngularJS ui-sref的簡(jiǎn)單使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04

