2017-02-17 53 views
0

我想找到一种方法来创建一个服务,可以坐在我的最高级别的作用域,并保存变量,如用户状态和其他任何。AngularJs服务绑定不更新

现在我正在尝试创建一个简单的示例,将数字绑定在一起。然而,UI层不会更新,除非我强迫我的角度再次获得价值。

如果您删除了说getNumber()的行,您会发现html上的数字永远不会更新会发生什么情况。我试着调用$ apply,并且给我一个已经生效的错误。

代码:

$scope.update = function() { 
     SampleService.update(); 

//Forcing the number to be updated by asking the service to return it 
     $scope.number = SampleService.getNumber(); 

    }; 
//Why doesn't this force $scope.number to change as SampleServce.number changes? 
    $scope.number = SampleService.number; 

服务:

(function() { 
'use strict'; 

angular 
    .module('Services') 
    .service('SampleService', SampleService); 

SampleService.$inject = ['$http']; 

function SampleService($http) { 

    var Service = { 
     number: 0 
    }; 


    Service.update = function() 
    { 
     Service.number += 1; 
    }; 

    Service.getNumber = function() 
    { 
     return Service.number; 
    }; 

    return Service; 
} 
})(); 

回答

0

发生这种情况是因为numberService的原始属性。设置$scope.number(这是一个原语)等于SampleService.number(这也是一个原语)完成ByVal,而不是ByRef。

添加SampleService对象本身$scope将创建一个参考,正如返回任何对象是的SampleService性质。下面是引用服务,而不仅仅是单一的基本属性的一个例子:

$scope.service = SampleService; 

{{service.number}} 

http://plnkr.co/edit/eWk8lZRa0dGIhd2I8h9t?p=preview

+0

我只是想通了,但不是存储$ scope.service = SampleService我这样做,$ scope.State = SampleService.getData()它从SampleService返回Service对象。我们两种类似但不同的方法有什么好处或缺点? –

+0

直接设置和使用'getData()'之间的唯一区别是通过使用'getData()'函数,您的服务不必返回任何内容。 – Claies

+0

谢谢你回答这个问题和评论中的问题。我喜欢我的getData方法,因为我可以从字面上看到我期待我的数据。 –

0

数字,字符串等基本类型作为值传递的,而不是引用,因此你得到的实际数量(即7)而不是Service.number的地址。

我只知道绕过这个方法是返回一个对象,并使用它的属性。

+0

我认为这就是我在我的serivce,在那里我返回变量服务的底部做。因为在控制器中,我可以在SampleService级别上调用服务内部公开的SampleService上的方法。 –