博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AngularJS和DataModel
阅读量:4639 次
发布时间:2019-06-09

本文共 6484 字,大约阅读时间需要 21 分钟。

 

通常,在AngularJS中使用JSON作为存储数据的模型。我们可能这样在controller中写model:

 

app.controller('BookController',['$scope',function($scope){    $scope.book = {        id:1,        name:'',        author:'',        stores:[            {id:1, name:'', quantity:2},            {id:2, name:'', quantity:2},            ...        ]    };}])

 

在视图中也许这样用到这个model:

 

 

当我们需要从服务端获取数据的时候,可能这样写:

 

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;        })    }}])

 

在视图中可能这样使用:

 

is available:

 

以上,JSON格式的model只能在BookController中使用,如何在其他controller中也可以使用呢?

--通过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;}])

 

以上,通过factory的方式创建了类似Book的一个Data Model,现在可以注入到controller中去了。

 

app.controller('BookController', ['$scope', 'Book', function($scope, Book){    $scope.book = new Book();    $scope.book.load(1);}])

 

在视图中也会有相应的变化。

 

is abailble:

 

以上,多个controller可以使用同一个有关book的Data Model了,如果多个controller处理同一个有关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服务去掉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;}]);

 

现在,多个controller可以使用同一个booksManager服务。

 

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;        })    }])

 

参考:http://www.webdeveasy.com/angularjs-data-model/

 

转载于:https://www.cnblogs.com/darrenji/p/5192839.html

你可能感兴趣的文章
导入.sql文件入数据库
查看>>
I/O模型
查看>>
EMQ --集成搭建
查看>>
对poi-Excel导入的浅层理解
查看>>
checkbox修改功能保存功能绑定
查看>>
网站推荐:11个相似图片搜索网站(以图找图)
查看>>
Html5 Canvas初探学习笔记(13) -图片变换
查看>>
NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
查看>>
web.xml is missing and <failOnMissingWebXml> is set to true
查看>>
jersey 过滤器名称绑定的问题 NameBinding Provider
查看>>
cookie-session理解
查看>>
Spring源码窥探之:BeanPostProcessor
查看>>
Creating a Fragment 创建一个片段
查看>>
获取手机中的图片,然后上传
查看>>
sqlserver 分页查询总结
查看>>
多台centos服务器同步更新代码文件
查看>>
关于用户管理的思考
查看>>
小试牛刀【龙哥翻译】
查看>>
利用python重启路由器
查看>>
oracle 闪回操作(flashback)
查看>>