如何将服务中的所有变量更新更新到控制器中的$ scope.var

时间:2015-06-05 14:16:58

标签: angularjs angularjs-scope

每次在我的服务中更新变量时,我都在尝试更新控制器中的变量。我正在使用$ scope。$ watch(),但遗憾的是只有最后一次更改正在生效。这是我使用的代码。有谁知道这有什么问题吗? 服务:

rApp.factory('pService', ['$http', '$rootScope', '$sanitize', 

function ($http, $rootScope, $sanitize) {

 var pService = {};

 //Some other code

 pService.Update=function(status)
 {
   if(status.LastItemId!=undefined)
   {
     pService.disItemId = status.LastItemId;
   }
 }

 //Some other code

return pService;

});

Controller:

rApp.controller('dController', ['$scope','$rootScope' 'pService' ,dispenseController]);

function dController($scope,$rootScope, pService) {

$scope.$watch(function () { return pService.disItemId }, function (newVal, oldVal) {
        if (newVal != oldVal) {
            $scope.lastItemId = pService.disItemId;
        }
    })

});

1 个答案:

答案 0 :(得分:0)

在您的具体案例中:

您不需要使用$ watch。实际上你在标准角度应用中没有使用$ watch。

只需在您的控制器中执行此操作:

  $scope.lastItem = pService;

然后像这样使用var:

  $scope.lastItem.disItemId;

这将始终指向更新的disItemId。

问题

如果你像这样绑定var:

<强>服务

[...]
service.serviceVar = 1;
return service
[...]

这将创建带引用的“1”var。

<强>控制器

  [...]
  $scope.myvar = Service.serviceVar;
  [...]

这会将$ scope.myvar绑定到“1”引用。

如果您在服务中或在其他控制器中执行此操作:

   service.serviceVar = 2;

您将使用新引用创建一个新的var“2”,并将此引用分配给service.serviceVar。对旧的1 var的所有旧引用都不会更新。

<强>解决方案

为避免这样做:

<强>服务

[...]
service.servicevar = {};
service.servicevar.value = 1;
return service
[...]

使用新引用创建对象并将其分配给servicevar。您创建一个var“1”并将其分配给servicevar.value。

<强>控制器

[...]
$scope.myvar = Service.servicevar;
[...]

将servicevar引用分配给范围var。

查看

{{myvar.value}}

您可以使用var。

的属性来使用该值

更新var执行此操作:

service.servicevar.value = 2;

您将使用新引用创建一个新的var“2”,并用此引号替换旧引用。

但是这次你在控制器中保存了对servicevar的所有引用。

我希望我很清楚它能解决你的问题。

修改

我的回答只是对这个问题的部分答案。

以下是更新plunker

首先,您在控制器定义上有一个类型。你太早关闭大括号了。这是好的定义

app.controller('MainCtrl',['$scope','pService',

function MainCtrl($scope,pService) {

  $scope.serviceVar=pService.myVar;
  $scope.val = $scope.serviceVar;  

}]);

然后您在角度中使用windows.interval,而您需要使用$interval服务

示例:

app.factory('pService',function($interval){

  var pService={};

  pService.myVar={};

  pService.myVar.count=1;

  $interval(function(){
    pService.myVar.count++;
  },1000);

  return pService;
});

然后我的问题就出现了。您绑定了值而不是控制器中的对象。它现在看起来像这样:

  $scope.val = $scope.serviceVar;  

希望它能帮到你