在Angular中将数据从控制器发送到提供程序

时间:2015-05-18 07:28:43

标签: javascript angularjs

我试图了解提供程序在Angular 1.x中的工作方式。 我写这个东西来测试通过提供者发送角度事件对象:

var myMo = angular.module('myModule', [], function ($interpolateProvider) {
    $interpolateProvider.startSymbol('<%').endSymbol('%>');
});
myMo.provider ('eventTransport', function() {
  this.evento='';
  this.setEvent = function (event) {
    this.evento = event;
  };

  this.$get = function () {
    var enento = this.evento;
    return {
      returnName: function () {
        return evento;
      }
    };
  };
});
myMo.controller('MoCtrl', function ($scope, eventTransport) {
    $scope.signclick = function (eventobj) {
    console.warn('click');
    eventTransport.setEvent(eventobj);
    console.warn('clack');
    console.log(eventTransport.returnName());
    $scope.test = true;
}; });

我收到setEvent() is not a function的错误。请告诉我我的错误在哪里?还告诉我如何将数据发送到提供者配置功能(myMo.config)我发现了很多通过角度服务传输数据的例子,没有通过提供者传输数据的明确例子。

2 个答案:

答案 0 :(得分:0)

服务及其提供商不尽相同。您可以在启动时对provider进行一些自定义初始化(您需要添加后缀提供程序)。但是在控制器中,您将获得在$get函数中定义的对象/函数。

myMo.config(function (eventTransportProvider) {
  eventTransportProvider.setEvent(eventobj);
});

编辑: 我认为你不需要在启动时做任何事情。您只需使用提供商来配置您的服务。对于您的用例,您可以使用简单的getter和setter函数。

myMo.provider ('eventTransport', function() {

  this.$get = function () {
    var evento = '';
    return {
      getEvent: function () {
        return evento;
      },
      setEvent: function(event) {
        evento = event;
      }
    };
  };
});

provider只是factoryservice的更强大版本,但大多数情况下您不需要使用provider

myMo.factory('eventTransport', function() {
  var evento = '';

    return {
      getEvent: function () {
        return evento;
      },
      setEvent: function(event) {
        evento = event;
      }
    };
});

答案 1 :(得分:0)

只能从控制器访问此。$ get {}中定义的属性和函数。就目前而言,我认为您的this.setEvent函数只能在配置阶段访问,并且您需要使用以下内容调用它:

myMo.config(['eventTransportProvider', function(eventTransportProvider) {
  eventTransportProvider.setEvent(...);
}]);

您需要提供者吗?也许工厂会更合适。

编辑:如果你需要能够从.config和控制器中设置setEvent(),你可以这样做:

myMo.provider ('eventTransport', function eventTransportProvider() {
  var _evento = null;

  this.setEvent = function(event) {
    _evento = event;
  };

  this.$get = [function eventTransportFactory() {
    var service = {
      getEvent: function() {
        return _evento;
      },
      setEvent: function(event) {
        _evento = event;
      }
    };
    return service;
  }];
});