将变量从服务/工厂绑定到控制器


69

我有一个变量,将由一个或多个控制器使用,由服务更改。在那种情况下,我建立了一个服务来将该变量保存在内存中,并在控制器之间共享。

问题是:每次变量更改时,控制器中的变量都不会实时更新。

我创建这个小提琴来提供帮助。http://jsfiddle.net/ncyVK/

---请注意,当我增加count的值时,{{countService}}{{countFactory}}永远不会更新。

如何将Service / Factory变量绑定到Controller中的$ scope.variable?我做错了什么?

Answers:


118

您不能绑定变量。但是,您可以绑定包含此变量的变量访问器或对象。这是固定的jsfiddle

基本上,您必须将可以返回/或保留当前值的内容传递给范围。例如

厂:

app.factory('testFactory', function(){
    var countF = 1;
    return {
        getCount : function () {

            return countF; //we need some way to access actual variable value
        },
        incrementCount:function(){
           countF++;
            return countF;
        }
    }               
});

控制器:

function FactoryCtrl($scope, testService, testFactory)
{
    $scope.countFactory = testFactory.getCount; //passing getter to the view
    $scope.clickF = function () {
        $scope.countF = testFactory.incrementCount();
    };
}

视图:

<div ng-controller="FactoryCtrl">

    <!--  this is now updated, note how count factory is called -->
    <p> This is my countFactory variable : {{countFactory()}}</p>

    <p> This is my updated after click variable : {{countF}}</p>

    <button ng-click="clickF()" >Factory ++ </button>
</div>

因此,从本质上讲,工厂只是用于数据和数据功能的共享(单个)容器。您手动管理/同步$ scope中的数据?
sambomartin

1
@sambomartin对。伟大的文章在这里
user4815162342

2
因此,通过将函数传递为testFactory.getCount而不是调用它,并在UI中调用它,就可以绑定服务值。而如果您$ scope.countFactory = testFactory.getCount(),则在初始化时仅调用一次函数,而没有任何绑定?因此,如果值发生更改,以后不会更新吗?
mtpultz 2014年

@sambomartin,工厂不是单例。如果要使用单例容器,请改用服务。Service和Factory在角度上基本上是相同的,只是Service是单例而Factory不是。
2015年

4
@Aram不,工厂也是单身。Angular中的所有服务都是单例。当您在模块上注册工厂函数时,它将在调用时创建服务实例。
chipit24'9

0

绑定服务中的任何数据并不是一个好主意,但是如果您需要它,我建议您使用以下两种方法。

1)获取不在服务内的数据。在控制器内获取数据,绑定数据将没有任何问题。

2)您可以使用AngularJs事件功能。甚至可以通过该事件将数据发送到。

如果您需要更多示例,请参阅本文,它可能会为您提供帮助。

http://www.w3docs.com/snippets/angularjs/bind-value-between-service-and-controller-directive.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.