首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS中的Getters和Setters

AngularJS中的Getters和Setters
EN

Stack Overflow用户
提问于 2015-08-27 19:29:56
回答 3查看 6.4K关注 0票数 1
代码语言:javascript
复制
confirm("Ohhh, hello there, is it Ok to click Cancel?");

我认为这基本上是一个关于角度上的CRUD的问题。我对getter和setter有点困惑,主要是因为双向数据绑定几乎完成了获取和设置事物的所有工作。我想知道什么是创建getter和setter的最好的可伸缩方式,这样以后就不需要修改我的函数了。

关于第一种安排,我试着尽可能简单,但是我在开始和开始的时候感到不舒服。

安排01:

代码语言:javascript
复制
$scope.getData = function(){
  $http.get(url + '/data')
  .then( function (res) {
    return res.data; } );
};

$scope.setData = function () {
  $scope.data = $scope.getData();
};

$scope.insertData = function (data) {
  $http.post(url + '/data', { data: data})
  .then( function (res) {
    // nothing here. } );
};

然而,关于第二种安排,我想直接去我需要的地方。当我从服务器获取数据时,我会自动地将我的$scope.data设置为检索到的数据;

安排02:

代码语言:javascript
复制
$scope.getData = function () {
  $http.get(url + '/data')
  .then( function (res) {
    $scope.data = res.data;
  });
};

$scope.insertData = function (data) {
  $http.post( url + '/data', { data: data })
  .then( function (res) {
    $scope.getData(); //To update.
    //OR $scope.data.push(res.data);
  });
};

进一步看,我已经在角文档上找到了,但是如果角文档已经使用了getter/setter,那么使用getter/setter有什么意义呢?看看其他技术,很难比较,因为角有自动获取.

我甚至不知道如何提出这个问题。但是,基本上,我想知道我的getter和setter如何会损害我未来的应用程序,以及是否有一个好的方法,以及为什么要创建角度的getter和setter。

谢谢你的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-27 20:07:24

您的良好实践是将您的逻辑封装到服务中。您必须知道,在角度上,所有服务都是Singleton,只有一个服务实例。

我做了一个简单的例子,使用$q.defer(),它是延迟API中的允诺管理器

$q.defer() get 2方法:

  • 决心(价值):通过给予她最终的价值来解决我们的相关承诺。
  • 拒绝(理由):解决承诺错误的方法。

控制器

代码语言:javascript
复制
(function(){

function Controller($scope, $q, Service) {

  //Use promise manager
  var defer = $q.defer();
  ///Create our promise
  var promise = defer.promise;

  $scope.data = [];

  var newData = [
    {
      name:'john',
      age: 25
    },
    {
      name: 'toto',
      age: 13
    }
  ];

  Service.get().then(function(data){
    //Retrieve our data
    $scope.data = data;

    //Set new data to our factory
    Service.set(newData);

    //Retrieve new data
    Service.get().then(function(data){
      //Resolve new data
      defer.resolve(data);
    });

  });

  //Retrieve new dataset
  promise.then(function(data){
    $scope.data = data;
  })




}

angular
.module('app', [])
.controller('ctrl', Controller);

})();

服务

代码语言:javascript
复制
(function(){

  function Service($q){

    var data = [0,1,2,3,4];

    function set(value){
      data = value;
    }

    function get(){
      return $q(function(resolve){
        //Simulate latency
        setTimeout(function(){
          //Resolve our data
          resolve(data);
        }, 1000);
      });
    }

    return {
      get: get,
      set: set
    };

  }

  angular
    .module('app')
    .factory('Service', Service);

})();

代码语言:javascript
复制
  <body ng-app='app' ng-controller="ctrl">

    <pre>{{data}}</pre>

  </body>

因此,您可以使用该服务设置一些数据,并在需要时检索它。不要忘记,服务是singleton

你可以看到工作柱塞

票数 2
EN

Stack Overflow用户

发布于 2015-08-27 19:33:54

在JavaScript中,您通常不像OOP语言那样使用getter和setter,特别是因为您没有私有的概念(这样任何人都可以访问您的字段)。ES5有getter和setter,但它也增加了隐藏实现细节的缺失功能。如果您希望在AngularJS应用程序中获得附加逻辑的getter和setter,您可以简单地定义使用$watch更新的附加字段。

此外,如果每个字段都执行此操作,则在每次更改时发送HTTP请求都是一种开销。你所要做的是直接写到字段。

例如,WPF/C#要求您定义setter来引发OnPropertyChanged,但是在AngularJS中不需要这样做。您用AngularJS编写的所有内容都将自动触发所谓的$digest循环,在这个循环中,它将检查所做的更改。然后,它将自动更新用户界面,给出使用模板绑定或ng-model指令。

票数 1
EN

Stack Overflow用户

发布于 2015-08-27 19:56:23

如果您认为像纯Javascript一样,是基本相同的逻辑,那么angular所做的就是为您创建modules以便使用最佳实践,所以使用它们很容易。

代码语言:javascript
复制
function DataService($http) {
  this.get = function() {
    return $http.get(...);
  }

  this.create = function(newData) {
    return $http.post(...);
  }

  ..
}

用角度,就像阿里·加贾尼所说的,你基本上可以做到,

代码语言:javascript
复制
angular.module('myApp').service('DataService', ['$http', DataService]);

或者使用factory样式

代码语言:javascript
复制
function DataService($http) {
  var myPrivateVariable = "something";

  function get() {
    return $http.get(...);
  }
  ...

  // expose them public
  return {
    get: get
  };
}


angular.module('myApp').factory('DataService', ['$http', DataService]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32257949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档