AngularJS - 将范围(不带$)注入控制器

时间:2015-05-08 06:57:28

标签: javascript angularjs angularjs-scope

Material Design mdDialog documentation中,我注意到他们已经将范围(没有带前缀的美元符号)传递到底部附近的DialogController

(function(angular, undefined){
  "use strict";
  angular
   .module('demoApp', ['ngMaterial'])
   .controller('AppCtrl', AppController);
  function AppController($scope, $mdDialog) {
    var alert;
    $scope.showAlert = showAlert;
    $scope.showDialog = showDialog;
    $scope.items = [1, 2, 3];
    // Internal method
    function showAlert() {
      alert = $mdDialog.alert({
        title: 'Attention',
        content: 'This is an example of how easy dialogs can be!',
        ok: 'Close'
      });
      $mdDialog
        .show( alert )
        .finally(function() {
          alert = undefined;
        });
    }
    function showDialog($event) {
       var parentEl = angular.element(document.body);
       $mdDialog.show({
         parent: parentEl,
         targetEvent: $event,
         template:
           '<md-dialog aria-label="List dialog">' +
           '  <md-dialog-content>'+
           '    <md-list>'+
           '      <md-list-item ng-repeat="item in items">'+
           '       <p>Number {{item}}</p>' +
           '      '+
           '    </md-list-item></md-list>'+
           '  </md-dialog-content>' +
           '  <div class="md-actions">' +
           '    <md-button ng-click="closeDialog()" class="md-primary">' +
           '      Close Dialog' +
           '    </md-button>' +
           '  </div>' +
           '</md-dialog>',
         locals: {
           items: $scope.items
         },
         controller: DialogController
      });
      function DialogController(scope, $mdDialog, items) {
        scope.items = items;
        scope.closeDialog = function() {
          $mdDialog.hide();
        }
      }
    }
})(angular);

我已经读过$是一个命名约定,是确保变量不会被覆盖的好方法。为什么这段代码没有遵循该约定?在这种情况下,我们如何知道何时使用$,有什么意义?我相信在这种情况下,它必须不仅仅是命名约定,或者作者会选择使用$scope来保持一致性。

注意:我知道链接函数中$scopescope之间的区别,其中scope指向一组固定的参数。我不相信这就是scope在这种情况下使用的原因,但如果我错了,请随时告诉我。

谢谢!

2 个答案:

答案 0 :(得分:5)

我认为这里的文档不一致 - 同时也是正确的。

此处的scope$scope将是相同的,但我在阅读完源代码后才知道这一点。罪魁祸首行在InterimElement内,其中localsoptions扩展,后者又有scope属性。

 return showDone = compilePromise.then(function(compileData) {
              angular.extend(compileData.locals, self.options);

              element = compileData.link(options.scope);

我非常确定将$scope作为scope访问只是出于事件而保持清洁,应该使用$scope来引用{{1}提供的值就像在控制器中一样。

我已提交a pull request来修复不一致问题并编译a pen demonstrating the usage

答案 1 :(得分:0)

这不是常规的失败,甚至连你使用模式的片段都失败了。

使用scope而不是$scope,以避免在嵌套函数中覆盖变量。

选择将scope放置在没有dolar标志的情况下,以避免出现错误,从而获得该代码段。

例如,使用Controller as语法分隔内容可以帮助您解决问题。