[英]AngularJS best practices - Styleguide
我正在尝试使用google-styleguide网站上定义的一些角度最佳做法: https ://google-styleguide.googlecode.com/svn/trunk/angularjs-google-style.html
但目前我正在努力解决一些问题。 在我使用这个样式指南之前,我有$scope
变量可用于对变量进行$watch
。
app.controller('myController',['$scope', function($scope) {
$scope.$watch('myVariable', function(val) {
alert("I'm changed");
});
}]);
现在用我的新方法我不知道如何处理这个问题? 我还应该注入$scope
吗? 因为当我不使用$watch
时,我不必注入$scope
。
function myController($scope) {
var vm = this;
vm.myVariable = "aVariable";
vm.$watch('vm.myVariable', function(val) {
// error because $watch is undefined
});
//$scope.$watch - works
}
app.controller('myController',['$scope', myController]);
风格指南还建议使用原型。 但是,如果我必须注入服务怎么办? 在原型中使用服务的最佳方法是什么?
function myController(MyService) {
var vm = this;
vm.myService = MyService;
}
myController.prototype.callService = function() {
var vm = this;
vm.myService.doSomething();
}
这个对吗? 或者我错过了什么,是否有一个地方可以找到关于这种角度编程风格的更多信息?
在我看来,感觉更像是自然的javascript,我想用这种方式来组织我的AngularJS应用程序。
提前致谢
更新
对于“服务”问题,我想到的事情如下:
function MyBaseController(AService, BService, CService) {
this.aService = AService;
this.bService = BService;
this.cService = CService;
}
function myController() {
var vm = this;
MyBaseController.apply(vm, arguments);
}
myController.prototype.doSomething() {
var vm = this;
this.aService.somethingElse();
}
但这感觉不对..
即使你使用“控制器为”语法,注入$ scope来访问诸如$ watch之类的东西也是完全有效的。 例如:
JS
var MyController = function($scope) {
$scope.$watch('ctrl.someVar' function() {
...
});
this.someVar = 123;
}
MyController.$inject = ['$scope'];
HTML
<div ng-controller="MyController as ctrl">
....
</div>
您给控制器注入服务的第一个例子很好。 对于继承示例,我会做这样的事情。
var BaseController = function(AService, BService) {
this.aService = AService;
this.bService = BService;
}
BaseController.prototype.doSomethingWithAAndB = function() {
...
}
var MyController = function(AService, BService, CService) {
BaseController.call(this, AService, BService);
this.cService = CService;
}
MyController.$inject = ['AService', 'BService', 'CService'];
//Note: you'll need to add a polyfill for Object.create if you want to support ES3.
MyController.prototype = Object.create(BaseController.prototype);
如果您发现在子控制器中指定所有参数太麻烦,您可以随时注入$injector
并将其传递给您的基本控制器。
@rob答案是对的。 有充分合理的理由仍然希望在您的控制器中注入$scope
, $watch
$on
$emit
$broadcast
仅举几例。 当然,在某些情况下,您可以使用指令或服务来逃避此要求,但并不总是值得花时间或复杂性。
我已经将controller as
语法转发,但发现在我的大多数用例中,我仍然依赖于控制器中的$scope
。 我不喜欢这个,所以我最终得到了以下约定:
var MyController = function($scope) {
$scope.vm = {};
var vm = $scope.vm;
vm.propA = 1;
vm.propB = 2;
vm.funcA = function(){};
$scope.$watch('vm.propA' function() {
});
}
所以它使用了“旧学校”的方法,但有了新的学校感觉。 在视图中任何事情都关闭vm
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.