【问题标题】:AngularJS factory mixinsAngularJS 工厂混入
【发布时间】:2014-07-19 15:09:27
【问题描述】:

我已经看到了一些将方法作为 mixins 添加到 AngularJS 控制器的示例。 例如:

(function () {
  var app = angular.module('angularjs-starter', []);

  var ParentCtrl = function ($scope, $location) {
    $scope.path = function () {
      return $location.absUrl();
    };
  };

  app.controller('ChildCtrl', function($scope, $injector) {
    $injector.invoke(ParentCtrl, this, {$scope: $scope});
    $scope.url = $scope.path();
  });
})();

我希望能够将新方法作为“mixin”添加到工厂。 我怎样才能做到这一点?无法将 $scope 传递给工厂。

例如,以下行不通:

var serv = angular.module('myModule', [])

serv.factory('myService', ['$scope', '$injector', function ($scope, $injector) {
...

【问题讨论】:

  • 您不必将作用域传递给工厂。这就是阻止你做你想做的事情的原因吗?
  • 我正在寻找一种方法来做 mixins 以添加工厂方法。我提出的所有 mixin 示例都是针对控制器的。在我为控制器找到的示例中,总是使用 $scope。
  • 控制器通常会注入作用域,而工厂则没有。您可以将 rootScope 注入工厂,但通常这是不好的做法。
  • 我希望能够为工厂或服务的方法添加一些方法。有没有其他方法可以做到这一点?
  • 您可以将工厂注入到几乎任何 Angular 组件中,并使用其他方法和属性来装饰它。还有其他方法可以扩展它们。如果您想要更详细的答案,请更新您的问题,并提供有关您目标的更多细节。

标签: angularjs


【解决方案1】:

您可以使用angular.extend 来实现这一点,它将源对象的所有属性复制到目标对象中。

例如:

(function () {
  var app = angular.module('angularjs-starter', []);

  app.factory('CalculatorFactory', function() {
    return {
      add: function(arg1, arg2) {
        return arg1 + arg2;
      }
    }
  });

  app.controller('MainCtrl', function($scope, CalculatorFactory) {
    angular.extend($scope, CalculatorFactory);

    // $scope now has the `add() fn`
    var result = $scope.add(1, 2);
  });

})();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多