传递服务中的值

时间:2015-09-02 14:31:06

标签: javascript angularjs

  1. 我是否需要创建getCurrent来保持绑定(如果我的视图中有{{current.status}})?或current: current是否足够?

  2. 如果Id status,我是否会将绑定失去$scope.status = services.status。意义status如果更改,则不会在视图中更新。

  3. 是否会保留与someValue的绑定?这意味着如果我在$scope.someValue = services.someValue

    中更改了服务,它将在我的视图中更改
    function someService() {
    var current = {
        status: ''
    };
    
    var someValue = 'hello';
    
    //////////
    
    var service = {
        current: current,
        getCurrent: getCurrent,
        status: current.status,
        someValue: someValue
    };
    
    return service;
    
    //////////
    
    function getCurrent() {
        return current;
    }
    }
    

3 个答案:

答案 0 :(得分:1)

好的,正如您使用JavaScript进行编程一样,您并没有像在Java中那样使用getter / setter。

所有角度服务都是单身,因此您可以轻松共享部分数据。此外,通过创建工厂,您可以返回对象,并希望您想要内部,例如方法,将调用。您可以使用工厂模式进行连接。

在您的情况下,您可以将服务实例保存到当前的$scope

修改

在您的工厂中,您应该返回current个对象。然后,您应该在视图中使用它来检索当前状态。因此,您将获得对象,而不仅仅是固定值,因此会更新。

<强>控制器

(function(){

function Controller($scope, Service) {

  //Register the Service instance into our scope
  $scope.service = Service;

  //Retrieve current object with status property
  $scope.working = Service.current;

  //Retrieve VALUE of current object
  $scope.not_working = Service.status;

  $scope.changeStatus = function() {
    Service.changeStatus('another status');
  }

}

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

})();

<强>服务

(function(){

  function Service($timeout) {

    var current = {
      status: 'off'
    };

    var someValue = 'hello';

    $timeout(function() {
      //Update service status
      current.status = 'on';
    }, 500);

    //////////

    var service = {
      //Return the current object
      current: current,
      //Just set the VALUE of current.status
      status: current.status,
      getCurrent: getCurrent,
      someValue: someValue,
      changeStatus: changeStatus
    };

    return service;

    function getCurrent() {
      return current;
    }

    function changeStatus(status) {
      alert("status changed");
      //Modifying status property of current object
      current.status = status;
    }

  }

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

})();

<强> HTML

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

    Status : {{working.status}}<br>

    Status not updating : {{not_working}}<br>

    SomeValue : {{service.someValue}}
    <br>
    <button ng-click="changeStatus()">go</button>

  </body>

您可以看到Working Plunker

答案 1 :(得分:1)

  1. 不,你不需要getCurrent方法,current:current就足够了。
  2. 2&amp; 3.不,因为您要将范围变量设置为服务的属性($ scope.status = service.status),并且这些属性是字符串,所以不会保留绑定。但是,如果您将整个服务对象分配为范围变量并在绑定中使用点表示法,那么它们将是因为您将更新其引用被注入控制器(服务)的对象。需要注意的重要事项是为了理解为什么你的方法不起作用,但另一种方法是理解

    • 对象通过引用传递
    • 由于上述原因,angular建议您的绑定始终使用点表示法。

    这是您的代码可以使它工作的样子:

    use strict;
    use warnings;
    
    use URI;
    use URI::QueryParam;
    
    my $url = URI->new('http://test.com/index.php?id=123&test=1&l=1');
    
    for my $param ( $url->query_param ) {
        my $new_url = $url->clone;
        $new_url->query_param($param => $url->query_param($param) . 'a');
        print $new_url, "\n";
    }
    

    以下是样本plunker:http://plnkr.co/edit/n2P07mjwnMVHCl4l7SAj?p=preview。请注意,它有两个示例,第一个显示您的方法,第二个显示对象方法。

    编辑 - BIG CAVEAT:

    需要注意的一个重要注意事项是,在您的服务中,如果http://test.com/index.php?id=123a&test=1&l=1 http://test.com/index.php?id=123&test=1a&l=1 http://test.com/index.php?id=123&test=1&l=1a //service .factory('service', function() { var current = { status: 'theStatus' }; var someValue = 'hello'; var service = { current: current, status: current.status, someValue: someValue }; return service; }) // controller .controller('theCtrl', ['$scope', 'service', function($scope, service) { $scope.serviceData = service; }]) // view <p>{{serviceData.current}}</p> <p>{{serviceData.status}}</p> <p>{{serviceData.someValue }}</p> 变量发生更改,您的视图将不会更新。因为我们正在返回服务对象,所以更改将反映在服务对象的someValuecurrentsomeValue属性中,但这些属性不会导致原始current和{{1变量也同步。

答案 2 :(得分:0)

Angular将跟踪其范围内的变化及其执行脏检查。因此,当您的Angular应用程序中发生事件并调用$ apply或$ digest时,Angular将遍历所有$ watch值并相应地更新任何绑定值。

如果没有较新的controllerAs语法,您可能希望将任何要绑定的值放在$ scope对象上。然后,在Angular应用程序中触发的任何事件都将自动触发您的更新。

这是一个简单的演示绑定$ scope.status.value到三个DOM引用: http://codepen.io/anon/pen/KdKrqe

直接回答您的问题:

  1. 不,由于Angular脏检查,您不需要为绑定值创建getter / setter。但是,目前:目前还不够。这将重新分配Angular之外的值到其$ scope,并且根据Object类型,这将由值或引用分配。任何&#39;连接&#39;按值分配时,原始值将丢失(数字,字符串,布尔......)

  2. 是的,如果按值分配service.service,您将失去绑定,即您无法更新services.status以更新$ scope.status的值。如果您将其更改为:$scope.services = services;那么$ scope.services.status将被绑定。

  3. 如果您使用了上述建议,则任何更改都会反映在您的原始对象中:$scope.services = services;然后,对服务进行任何更改。将反映在您的原始对象中。

  4. 我认为这里的两个要点是理解JS中的值/引用赋值以及Angular如何通过脏检查实现绑定值。