【问题标题】:Angular factory: how to use method in object being declared?Angular 工厂:如何在被声明的对象中使用方法?
【发布时间】:2014-09-10 08:02:16
【问题描述】:

我正在为我的 Angular 应用程序创建一个工厂。
我在问如何在我声明的同一工厂中使用方法(此处为 setCurrentUser()):

app.factory('User', function ($rootScope) {
  var User = {
    create: function (authUser, username) {
        // ...
        setCurrentUser(username); // <== ERROR
      });
    },
    // ...
    setCurrentUser: function (username) {
      $rootScope.currentUser = User.findByUsername(username);
    },
    // ...
  };
  return User;
});

当然,使用this.setCurrentUser(username) 会产生未定义的错误...
请注意,我需要 setCurrentUser 成为 User factory 的方法,因为我必须从控制器中使用它(我不能将其定义为 User factory 的本地函数......)。

【问题讨论】:

  • User.setCurrentUser 怎么样?
  • 切换方法的位置。您在定义之前使用方法。
  • @aduch: 是的,它有效,简单而有效(我的错误是我自己没有考虑过这个解决方案...... :-()。

标签: javascript angularjs factory


【解决方案1】:

您可以做的是将函数用作本地变量并返回 User 对象(您的公共 API),如下所示:

app.factory('User', function ($rootScope) {
  var setCurrentUser = function (username) {
    $rootScope.currentUser = ...
  };

  var create = function(authUser, username) {
    // ...
    setCurrentUser(username); // <== NO ERROR
  };

  return {
    create: create,
    setCurrentUser: setCurrentUser
  };
});

【讨论】:

  • 一个很好的解决方案,比公认的解决方案更通用(虽然更优雅...... :-)。
  • @MarcoS 谢谢! :)
【解决方案2】:

我会尝试使用闭包,因为在您调用 User.create() 时已定义 User,因此您可以调用 setCurrentUser

User.setCurrentUser(username);

【讨论】:

  • 您能否解释一下为什么这值得一票否决,以便我可以改进它?谢谢你:)
【解决方案3】:

尝试在创建函数声明之前声明 setCurrentUser 函数。如果这没有帮助,你可以使用这个技巧:

var that = this;

在 User 对象中调用 setCurrentUser 为:

that.setCurrentUser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2017-07-20
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多