我正在尝试使用google样式指南网站上定义的一些angulars最佳实践: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吗?因为当我不使用$scope时,不需要注入$watch。
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();
}但这感觉不太好我..。
发布于 2014-03-27 19:30:24
即使当您使用“控制器作为”语法时,注入$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并将其传递给您的基本控制器。
发布于 2014-03-27 20:11:17
@罗伯的回答是正确的。仍然需要在控制器中注入$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上。
https://stackoverflow.com/questions/22631541
复制相似问题