【问题标题】:Getters and Setters in AngularJSAngularJS 中的 Getter 和 Setter
【发布时间】:2015-08-27 19:29:56
【问题描述】:
confirm("Ohhh, hello there, is it Ok to click Cancel?");

我认为这基本上是关于 Angular 上的 CRUD 的问题。我对 getter 和 setter 有点困惑,主要是因为 Angular 几乎完成了所有的获取和设置工作,因为它的 two way data binding。我想知道创建 getter 和 setter 的最佳可扩展方式是什么,这样我以后就不需要修改我的函数了。

在第一个 Arrangement 中,我试图尽可能简单,但我在开始和开始设置时感到不舒服。

安排01:

$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:

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

进一步看,我在 Angular 文档中找到了 this,但是如果 Angular 已经使用了 getter/setter,那么还有什么意义呢?查看 other technologies,很难比较,因为 Angular 有自动获取功能。

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

感谢您的建议。

【问题讨论】:

  • 服务就是答案。使用.factory({});
  • 谢谢,@AliGajani。它有什么帮助?我不想自动创建函数,我想知道最佳实践。

标签: javascript angularjs oop getter-setter


【解决方案1】:

你的好习惯是将你的逻辑包装到Service中。你要知道,在Angular中,所有的服务都是Singleton,一个Service只有一个实例。

我做了一个简单的例子,使用 $q.defer(),它是延迟 API 中的 promise manager。

$q.defer() 获取2个方法:

  • resolve(value) :通过给她最终值来解决我们的相关承诺

  • reject(reason) : 解决一个 promise 错误。

控制器

(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);

})();

服务

(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);

})();

HTML

  <body ng-app='app' ng-controller="ctrl">

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

  </body>

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

你可以看到Working Plunker

【讨论】:

  • 谢谢@Paul Boutes,您展示了技术方面的内容。我将加强对承诺和服务的研究,以便更好地理解您的代码。但是,在理论上,你帮了我很多。谢谢!
【解决方案2】:

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

此外,如果您对每个字段都执行此操作,那么在每次更改时发送 HTTP 请求的解决方案都是一种开销。相反,您需要直接写入字段。

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

【讨论】:

  • 在应用程序中,我正在“获取”和“设置”每个模板更改以及每次需要更新 DOM 的更改之后。所以,@Darneas,我应该忘记 OOP 并专注于面向事件吗?
  • @RodrigoSouza:我更新了我的答案。您应该在 JavaScript 中取消 OOP。并不是说它破坏了事物,而是你增加了复杂性而没有从中得到任何东西。在 OOP 中执行 getter 和 setter 的所有好处在 JavaScript 中都不存在,因此剩下的所有内容都是用于简单任务的非常复杂的代码;-)。
  • 这让我感觉好多了。我的一个朋友看着我的代码说“你为什么不使用 getter 和 setter?”,我说“嗯,它太复杂了”,但随后他谈到了复杂性和可伸缩性。那么,我可以使用我的 getter 从服务器获取数据并将其绑定到本地 Scope 对象,而不会对代码的可维护性造成任何不利影响?
  • 现在你要回答一个深奥的问题。可维护的代码是易于理解并且可以轻松适应不断变化的需求的代码。 AngularJS 一开始对你来说可能看起来很神奇,但这很正常。为它添加人为的复杂性,以“使其易于理解”无济于事。读者必须学习 Angular 并且应该应对它。而对于这些高级 Angular 开发人员来说,getter 和 setter 只是不必要的复杂性。
  • 你的观点很扎实,@Darneas。我很喜欢它! “读者必须学习 Angular 并应对它”,我喜欢这个!非常感谢。
【解决方案3】:

如果你认为纯 Javascript 是基本相同的逻辑,Angular 所做的就是创建 modules 以供你使用最佳实践,因此使用起来很容易。

function DataService($http) {
  this.get = function() {
    return $http.get(...);
  }

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

  ..
}

并且使用 angular,就像 Ali Gajani 说的,你基本上可以做到这一点,

angular.module('myApp').service('DataService', ['$http', DataService]);

或使用factory 样式

function DataService($http) {
  var myPrivateVariable = "something";

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

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


angular.module('myApp').factory('DataService', ['$http', DataService]);

【讨论】:

  • 好吧,谢谢你,@Guilherme。我会结合你所有的答案。 :)
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2011-10-05
  • 2015-08-05
  • 2016-10-20
相关资源
最近更新 更多