2015-10-15 78 views
1

我正在使用我继承的传统VB.Net应用程序。的NG-应用和NG-控制器指令都在根主页的HTML元素上出现:角度控制器返回undefined

<html runat="server" id="html" ng-controller="MasterController"> 

ng-app属性在用于页面设置代码隐藏。当我运行页面并查看源代码时,它就存在了。该应用程序可以被限制在模块ng-app="myModule"

该控制器在母版传递到add_load也不太在所述主体的端部的函数来定义,而不是远离它:

Sys.Application.add_load(function() { 

     var module = angular.module('myModule'); 
     var MasterController = function ($scope, $compile) { 
      ... // stuffs 
      } 
     }; 

     module.controller('MasterController', ["$scope", "$compile", MasterController]); 

    }); 

局部,这工作(或似乎工作)罚款,我看到控制台中没有错误。然而,应用程序现在已经部署到暂存环境,在该环境中浏览器控制台我看到一个角度误差:

[ng:areq] not a function got undefined

有临时区域和我的本地环境中,这些差异之间的差异非常少很大程度上是.Net脚本捆绑器用于连接和缩小一堆JS文件,包括Angular和应用程序使用的数据。 AFAIK没有其他差异。

我不认为捆绑器导致问题,因为我启用了本地捆绑,我没有看到错误。我也看不到传递给应用程序的数据会导致问题(它是客户数据,帐户数据等),因为它甚至不在此特定控制器中使用。

回答

2

不要使用函数表达式语法,因为可以在分配变量之前调用它。根据best practices guide使用函数声明语法。

此外,由于您正在传递函数引用,请将注入件完全拉出以确保您的代码是安全的。

var module = angular.module('myModule'); 
function masterController($scope, $compile) { 
    ... // stuffs 
} 

masterController.$inject = ["$scope", "$compile"]; 

module.controller('MasterController', masterController); 
+0

感谢您的提示!风格指南看起来不错。我会尽快尝试这些 – danwellman

+0

还是不明白为什么这是最佳做法。为什么将一个声明控制器的逻辑行分成3行是如此聪明的想法...... –

+1

@PetrAveryanov因为Angular 1.x依赖注入使用字符串匹配和/或稍后添加的数组语法“hack”(1.2版或许? )。通过明确地将其拉出,您可以确保您的代码具有依赖性,并且它是明确的且非常易读。任何后续的开发人员都会完全知道这段代码在做什么。另外,有多少控制器最终成长为注入10个参数?这使得很长的“一线”。将它分开可以更容易地控制和阅读您的声明。 –