AngularJS:如何使用具有双向数据绑定的工厂

时间:2013-12-27 00:25:19

标签: angularjs

编辑: 工作人员:http://plnkr.co/edit/iInh7TnbGvSHSPOWuWPk?p=preview

=============================================== =====================

在下面的plunker中: http://plnkr.co/edit/TIfkYE?p=preview

一个非常简单的例子比较了工厂和服务的用法。双向数据绑定使用服务而不是工厂。为什么呢?

使用服务:

<button btn-radio="item.nb" ng-model="fromService.current>

单击该按钮可正确更新服务的属性当前状态。

但是,使用工厂:

<button btn-radio="item.nb" ng-model="fromFactory.current>

单击该按钮不会从工厂更新工厂的属性当前。

我的用例如下:我想使用服务/工厂跨控制器和其他服务共享数据。

我已阅读了很多参考资料,包括:

2 个答案:

答案 0 :(得分:8)

问题是var current是一个基元,当你使用它作为一个值初始化对象时,它不会创建对初始变量的引用,对象属性只会获取它的值。

在您的isCurrent函数中,您正在与原始变量进行比较,而原始变量永远不会发生变化。但是,您使用current

创建的双向绑定更改了ng-model属性

简单示例(可以在浏览器控制台中将其粘贴以确认):

var current=0;
var obj={
  current: current
}

current=10;
alert(obj.current)// hasn't changed, is still 0

要修复工厂,您需要与工厂返回的对象进行比较

myApp.factory('fromFactory', function() {
  console.log("factory is called");
    var current = 0;
    return {
        current: current,
        isCurrent: function (nb) {

           /* change return nb === current;*/

          /* compare to the object version of "current" which is bound to ng-model*/
          return nb === this.current;
          },
        printCurrent: function () {
          console.log("print fromFactory", this.current);
        }
    };
});

答案 1 :(得分:2)

另一个解决方案是构造一个对象并将其返回:

myApp.factory('fromFactory', function() {

    console.log("factory is called");

    var exports = {};
    exports.current = 0;
    exports.isCurrent = function (nb) {
          return nb == exports.current;
    };
    exports.printCurrent = function () {
        console.log("print fromFactory", exports.current);
    };

    return exports;
});

这个和charlietfl解决方案都很完美。 工作人员: http://plnkr.co/edit/iInh7TnbGvSHSPOWuWPk?p=preview