通过调用角度控制器函数从ng-init指令初始化服务器数据?

时间:2016-08-12 07:27:52

标签: javascript angularjs

我们开发了一个企业应用程序,完整的客户端框架构建在AngularJS上,服务器端框架构建在ASP.NET Web API上。在应用程序中,我们有350多个html页面和250多个Web API。我们通过调用控制器函数从ng-init指令初始化服务器数据有很多方面。因为在我们的应用程序中,所有数据都来自ASP.NET Web API。但是我对ng-init的文档感到很惊讶,该文档用一个很好的大胆的大纲说明:

ngInit唯一适当用于别名ngRepeat的特殊属性,如下面的演示所示。除了这种情况,您应该使用控制器而不是ngInit来初始化范围上的值。

我希望得到行业专家/ Angularjs核心团队成员的反馈意见。

首先让我简要介绍一下我们在应用程序中做了什么,为了显示行业列表,我们加载行业HTML页面并显示服务器数据。 HTML模板代码如下所示:

<div ng-init="initIndustries()">....</div>

将从初始化的industryCtrl调用“initIndustries”函数。 industryCtrl.js代码如下所示:

app.controller("industryCtrl",["$scope",function($scope){

//Sets the server data in the $scope property.
$scope.initIndustries = function(){
//perform ajax request and set the data into the $scope property.
}

$scope.initAddIndustry = function(){
// perform ajax request for getting a dropdown data on Add Industry Page.
}
}])

根据下面提到的Angularjs DocAnglarjs-styleguide guideline on Keep Controller Focused,我没有什么顾虑:

  1. 我们是否通过函数初始化数据时出错了,因为所有数据都来自Server API?
  2. 当前的初始化方法违反了基于AngularJS的应用程序中的行业惯例。如果是,那么我们需要在申请中遵循哪种方法?
  3. 根据angularjs-styleguide,我们是否需要为每个视图创建一个sperate控制器,只是为了动摇客户端测试覆盖?
  4. 实现上述方法的原因(通过控制器函数初始化ng-init指令中的数据),由于应用程序较大,我最初的想法是遵循MVC解耦代码和关注点分离的理念。

1 个答案:

答案 0 :(得分:0)

Angular被称为Model-View-Whatever。因此,完全取决于您是否遵循角度应用中的结构。

不遵循结构有一些优点和缺点。

赞成 1.一个控制器中可用的数据可以在许多视图中共享,因此您不必使用$ rootScope或HTML5 localStorage / sessionStorage将数据从一个控制器传递到另一个控制器。

缺点 1.由于控制器中的数据在多个视图中可用,因此维护数据非常困难,因为数据显然绑定到视图,并且在相同数据上将存在许多隐式角度监视。这会带来糟糕的表现。

现在回答使用ng-init初始化控制器中数据的第1点和第2点。我认为这不是一个好方法,因为你已经根据视图进行了初始化。 让我们根据请求找到您的视图,然后初始化不会发生。并且由于初始化不会发生,控制器中将存在垃圾值/错误。因此最好将控制器初始化与视图分开。

对第3点的回答是,当您为每个视图使用单独的控制器时,实际上是在避免单片代码方法,这总是一个好点,因为这会导致模块化方法。 Angular JS中的关注点分离不仅仅是为每个视图使用单独的控制器,但从长远来看,服务和指令也是为此目的。

希望能以某种方式帮助你。