AngularJS:控制器/服务应该是Pascal案例吗?(在自耕农中使用Yo)

Mar*_*tin 20 angularjs yeoman

我已经开始使用Yo(yeoman)为angularjs搭建我的控制器,服务等.

我通常做一个

  yo angular:service passwordService
Run Code Online (Sandbox Code Playgroud)

我正在使用驼峰案例,因为这是它创建的文件的名称,但我注意到它也使用相同的名称作为服务的名称,所以

passwordService
Run Code Online (Sandbox Code Playgroud)

而不是

PasswordService
Run Code Online (Sandbox Code Playgroud)

这里的最佳做法是什么?

谢谢

Eze*_*tor 20

值得注意的是,在很多地方的开发者指南中(包括链接到"服务"部分),AngularJS开发人员使用camelcase +第一个小写来表示服务名称和其他内容.所以也许你会认为这是AngularJS的最佳实践.

也就是说,我认为从其他语言来看,使用camelcase +第一个大写来命名服务和类更常见,实际上在JavaScript中,这似乎是特别重要的.考虑到你有一个名为user-then 的类,你会称之为包含实例的变量是user什么?如果user没有极其笨拙/容易出错的阴影,你就无法调用它.

在AngularJS中,您的$resource服务最终将成为您的"OO JavaScript"中的类.看:

angular.module('Foo', [], function() {}).factory('User', function() {
  var User = $resource('/api/user');

  User.prototype.getFullName = function() {
    return this.firstName + ' ' + this.lastName;
  };

  return User;
});
Run Code Online (Sandbox Code Playgroud)

看看我要去哪里?您最终将注入新的User $resource并实例化它:

function MyController($scope, User) {
  var someNewUser = new User();
};
Run Code Online (Sandbox Code Playgroud)

或者您希望使用user与当前项目类似的简单var名称迭代多个用户:

angular.forEach(someUsers, function(user) {
  // Good thing you didn't name your $resource "user"!
  // Weird/undesirable shadowing would result here then...
});
Run Code Online (Sandbox Code Playgroud)

如果您需要更多说明,为什么我认为在给定JavaScript的上下文的情况下,最佳实践是类/服务名称的第一个大写.(相比之下,请考虑在PHP var名称中加上前缀$,因此var名称和类名之间不会发生阴影.$ User = new User()非常好.)

当然,你可以User = new user()用JS 做,但这与现有语言/风格指南的标准相反.

  • 你要找的是PascalCase. (2认同)

Umu*_*acı 15

对于Javascript约定,只应PascalCase在且仅当相关函数是constructor函数时使用.(即必须与之通话new).重要的是因为它让程序员知道必须使用new,否则this属性将被搞砸.

对于工厂和供应商等,您应该实际使用 camelCase约定.

更新

虽然我的初始声明仍然存在于Angular之外的JS环境中,但我现在认为最好使用PascalCase注入变量.这已成为很长一段时间的惯例,不值得反击.由于注入的变量几乎总是单个的并且是应用程序范围的,因此将它们与函数范围中创建的局部变量区分开来感觉是正确的.

  • 从技术上讲,没有什么能阻止工厂或提供者返回一个可以用"new"作为构造函数调用的函数.我普遍同意,虽然使用camelCase会有意义.但是,由于您通常会使用['Service',function(service){}]表示法,因此它没有实际意义.函数变量可以是大小写. (2认同)