范围变量在ng-click处理程序中不可见

时间:2017-05-17 21:22:01

标签: javascript angularjs

我对Angular很新,我想弄清楚这里有什么问题。有一个控制器定义如下:

(function(){
    function myController($scope, CommsFactory) {

        $scope.doSomething = function() {
            var x = $scope;  // <- Doesn't work because $scope is not defined
        }
    }

    angular
        .module('aModule')
        .controller('myController', myController);
})();

然后通过点击按钮调用doSomething()方法:

<input type="button" ng-click="doSomething()" class="btn--link" value="do it"/>

这对我来说似乎很简单,但问题是,当我在方法中破解时,$ scope未定义。这与我见过的大多数例子不同,我无法弄清楚原因。这不应该是可见的吗?显然很多代码都丢失了 - 我试图只显示相关的部分 - 我可能会遗漏其他地方的某些内容吗?

3 个答案:

答案 0 :(得分:2)

声明模块,然后您需要添加 []

这样的事情:

angular.module('aModule', [])
        .controller('myController', myController);
  

<强>用法

     

angular.module(name, [requires], [configFn]);

     

<强>参数

     
      
  • name .- 要创建或检索的模块的名称。
  •   
  • 需要(可选).- 如果指定,则创建新模块。如果未指定,则进一步检索模块   配置。

  •   
  • configFn(可选).- 模块的可选配置功能。与Module#config()相同。

  •   

请推荐阅读本指南关于Angular模块: angular.module

&#13;
&#13;
(function() {

  function myController($scope) {
    $scope.doSomething = function() {
      var x = $scope;
      console.log(x);
    }
  }

  angular
    .module('aModule', [])
    .controller('myController', myController);
})();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div data-ng-app="aModule">
  <div data-ng-controller="myController">
    <input type="button" ng-click="doSomething()" class="btn--link" value="do it" />
  </div>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您的代码通常正常工作,如this fiddle中所示。

您的主要问题似乎在于$scope的使用。 $scope是一个对象,包含相应模板中应该可用的所有变量和方法。因此,您始终引用$ scope的成员,而不是整个对象。 此外,John Papas AngularJS风格指南推荐使用controllerAs支持$scope,原因有多种Y030

按照惯例,您还应该为控制器提供大写名称并使用显式依赖注入

典型的用例更像是:

(function(){

    angular
        .module('aModule', [])
        .controller('myController', MyController);

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

    function MyController($scope, CommsFactory) {
        var vm = this;
        vm.doSomething = doSomething;

        function doSomething() {
            var $scope.x = "Did it!";
        }
    }

})();

答案 2 :(得分:0)

解决:事实证明,我所遇到的问题与Chrome调试器的工作方式有关。它似乎在你破坏的函数之外定义了一些延迟加载的变量(至少就我所描述的那样)。这意味着,至少在我的情况下,如果我在方法内部破坏,并且$ scope实际上并未在该方法中使用(不幸的是,我做了很多因为我试图验证$ scope是可见的),然后调试器将报告$ scope不可用。