来自全局函数的Angular问题,自测试版1.3.0b15以来中断.需要帮助

Issue with Angular from global functions, broken since beta 1.3.0b15. Need help please

本文关键字:0b15 中断 帮助 自测试 函数 全局 Angular 问题 测试版      更新时间:2023-09-26

Angular JS控制器问题


抱歉发了这么长的帖子。我相信这是一个简单的问题,我刚刚工作了一整夜,对此视而不见,但希望有人能帮忙!


这是我的角度示例问题。我将XML转换为Json,而不是使用angular进行解析。我的控制器无法工作,因为它是全局定义的。它在Angular.JS 1.3.0 beta 15版本中停止工作。我试过下面列出的东西来修复它,但我在哪里都找不到。

我在角度方面不是很有经验,但我知道很多其他语言,所以这对我来说没有意义。也许这里有人可以帮助我。我已经尽力在下面解释了。

这个plunker是它与angular 1.0.4中定义为全局函数的控制器一起工作的一个例子。我还放了一个readme.md,详细解释了这些问题!

http://plnkr.co/edit/fLgVHV1gJSigIB6jfZDH


这个问题显然是已知的,并在angular.js日志的github上进行了概述。

feat($controller):禁用全局控制器构造函数

除了简单的演示外,使用全局变量是没有帮助的用于控制器构造函数。这为$controllerProvider添加了一个新方法以重新启用旧行为,但默认情况下禁用此功能。

断裂变化:CCD_ 2将不再在CCD_ 3上查找控制器。在window上查找控制器的旧行为最初是为了用于示例、演示和玩具应用程序。我们发现允许全局控制器函数鼓励不良做法,因此我们决定通过违约

若要迁移,请使用模块注册控制器,而不是公开它们作为全局:

之前:

function MyController() {
...
}

之后:

angular.module('myApp', []).controller('MyController', [function() {
// ...
}]);

你可以在这里看到关于断裂变化的注释


ANGULAR.JS在这里进一步解释

以下示例在上一个链接中给出:

<example>
    <example module="selectExample">
      <file name="index.html">
         <script>
        function MyCntrl($scope) {
          $scope.colors = [
            {name:'black', shade:'dark'},
            {name:'white', shade:'light'},
            {name:'red', shade:'dark'},
            {name:'blue', shade:'dark'},
             {name:'yellow', shade:'light'}
          ];
          $scope.myColor = $scope.colors[2]; // red
        }
        angular.module('selectExample', [])
          .controller('ExampleController', ['$scope', function($scope) {
            $scope.colors = [
              {name:'black', shade:'dark'},
              {name:'white', shade:'light'},
              {name:'red', shade:'dark'},
              {name:'blue', shade:'dark'},
              {name:'yellow', shade:'light'}
            ];
            $scope.myColor = $scope.colors[2]; // red
          }]);
       </script>
        <div ng-controller="MyCntrl">
        <div ng-controller="ExampleController">
           <ul>
             <li ng-repeat="color in colors">
               Name: <input ng-model="color.name">
      

[我试图在这个plunker中将其重新定义为角度函数][3]

因此,基于这个例子,我认为我需要将代码从更改为

var AppController = function($scope, DataSource) {
    var SOURCE_FILE = "example.xml";
    xmlTransform = function(data) {
        console.log("transform data");
        var x2js = new X2JS();
        var json = x2js.xml_str2json(data);
        return json.xmldata.Categories;
    };
    setData = function(data) {
        $scope.dataSet = data;
    };
    DataSource.get(SOURCE_FILE, setData, xmlTransform);
};

并将其更改为:

    myApp.controller('AppController', function($scope, Datasource) {
      var SOURCE_FILE = "example.xml";
      xmlTransform = function(data) {
          console.log("transform data");
          var x2js = new X2JS();
          var json = x2js.xml_str2json(data);
          return json.xmldata.Categories;
      };
      setData = function(data) {
          $scope.dataSet = data;
      };
      DataSource.get(SOURCE_FILE, setData, xmlTransform);
  });

当我这样做的时候,我会得到这个错误:

错误:$injector:unp

未知提供商

未知提供程序:数据源提供程序<-数据源<-AppController

说明


这是一个非常不想要的工作!但有效

需要注意的一点是,引用angular.js github:

虽然不推荐,但您可以重新启用旧的行为,如下所示:

angular.module('myModule').config(['$controllerProvider', function($controllerProvider) {
  // this option might be handy for migrating old apps, but please don't use it
  // in new ones!
  $controllerProvider.allowGlobals();
}]);

然而,我不希望有这个全局函数。我不确定这个问题是否与我正在使用的XML2JSON脚本有关。我希望有人能帮助我。

谢谢!

您必须注入DateSource factory对象,如下所示:

myApp.controller('AppController', ['$scope', 'DataSource', function($scope, DataSource) {
     ...
}]);

将其更改为

myApp.controller('AppController', ['$scope', '$Datasource', AppController]);

基本上,第二个参数应该是一个数组,其最后一个参数应该为提供控制器定义的函数。

编辑

要修复myApp问题,请使用以下语法

angular.module('myApp').controller('AppController', ['$scope', '$Datasource', AppController]);

 var myApp = angular.module('myApp',['myApp.service']);

使用myApp变量时没有定义它(将模块存储在名为myApp的变量中,或者在运行时获取模块以定义控制器)