首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS最佳实践-样式指南

AngularJS最佳实践-样式指南
EN

Stack Overflow用户
提问于 2014-03-25 10:20:55
回答 2查看 3.1K关注 0票数 6

我正在尝试使用google样式指南网站上定义的一些angulars最佳实践:https://google-styleguide.googlecode.com/svn/trunk/angularjs-google-style.html

但目前我还在为一些问题而挣扎。在使用这个样式指南之前,我可以使用$scope变量对一个变量执行$watch

代码语言:javascript
复制
app.controller('myController',['$scope', function($scope) {
    $scope.$watch('myVariable', function(val) {
       alert("I'm changed");
    });
}]);

现在用我的新方法我不知道怎么处理这件事?我还应该注射$scope吗?因为当我不使用$scope时,不需要注入$watch

代码语言:javascript
复制
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]);

样式指南还建议使用原型。但如果我要注射一种服务呢?在原型中使用服务的最佳方法是什么?

代码语言:javascript
复制
function myController(MyService) {
   var vm = this;

   vm.myService = MyService;
}

myController.prototype.callService = function() {
   var vm = this;

   vm.myService.doSomething();
}

这是正确的吗?或者我遗漏了什么,有没有地方可以让我找到更多关于这种角度编程的信息?

在我看来,它更像是自然的javascript,我想用这种方式来组织我的AngularJS应用程序。

提前感谢

更新

关于“服务”问题,我想到了以下几点:

代码语言:javascript
复制
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();
}

但这感觉不太好我..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-27 19:30:24

即使当您使用“控制器作为”语法时,注入$scope来访问$watch这样的东西也是完全有效的。例如:

JS

代码语言:javascript
复制
var MyController = function($scope) {
    $scope.$watch('ctrl.someVar' function() {
        ...
    });

    this.someVar = 123;
}

MyController.$inject = ['$scope'];

HTML

代码语言:javascript
复制
<div ng-controller="MyController as ctrl">
    ....
</div>

您给出的将服务注入控制器的第一个示例很好。对于继承的例子,我会这样做。

代码语言:javascript
复制
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并将其传递给您的基本控制器。

票数 7
EN

Stack Overflow用户

发布于 2014-03-27 20:11:17

@罗伯的回答是正确的。仍然需要在控制器中注入$scope,例如$watch $on $emit $broadcast,这是完全合理的理由。当然,在某些情况下,您可以使用指令或服务来满足这一需求,但它并不总是值得花费时间或复杂性。

我已经尝试了controller as语法,但发现在我的大多数用例中,我仍然依赖于控制器中的$scope。我不喜欢这样做,所以我最后参加了以下会议:

代码语言:javascript
复制
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上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22631541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档