Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过调用angular controller函数从ng init指令初始化服务器数据?_Javascript_Angularjs - Fatal编程技术网

Javascript 通过调用angular controller函数从ng init指令初始化服务器数据?

Javascript 通过调用angular controller函数从ng init指令初始化服务器数据?,javascript,angularjs,Javascript,Angularjs,我们开发了一个企业应用程序,完整的客户端框架基于AngularJS,服务器端框架基于ASP.NET Web API。在应用程序中,我们有350多个html页面和250多个Web API。在许多领域中,我们通过调用控制器函数从ng init指令初始化服务器数据。因为在我们的应用程序中,所有数据都来自ASP.NET Web API。但我对ng init的文档感到惊讶,它以一个漂亮的粗体轮廓表示: ngInit的唯一适当用途是对ngRepeat的特殊属性进行别名,如下面的演示所示。除此之外,您还应该使

我们开发了一个企业应用程序,完整的客户端框架基于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>
基于以下内容,我很少有顾虑:

  • 因为所有数据都来自服务器API,所以我们是否在通过函数初始化数据时出错
  • 当前的初始化方法与基于AngularJS的应用程序中的行业实践背道而驰。如果是,那么在应用程序中我们需要遵循哪种方法
  • 根据angularjs styleguide,我们是否需要为每个视图创建sperate控制器,只是为了动摇客户端测试覆盖率

  • 实施上述方法(通过控制器函数从ng init指令初始化数据)的原因是,由于应用程序庞大,我最初的想法是遵循MVC的原理,即解耦代码和分离关注点。

    Angular被称为模型视图。所以,这完全取决于你是否遵循角度应用程序中的结构

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

    专业人士 1.一个控制器中可用的数据可以跨多个视图共享,因此您不必使用$rootScope或HTML5 localStorage/sessionStorage将数据从一个控制器传递到另一个控制器

    缺点 1.由于控制器中的数据在多个视图中可用,因此很难维护数据,因为数据显然绑定到视图,并且在同一数据上会有许多隐式角度表。那会造成糟糕的表现

    现在回答您关于使用ng init初始化控制器中的数据的第1点和第2点。我认为这不是一个好方法,因为您已经使初始化依赖于视图。 让我们假设一个场景,在该场景中,您的视图在请求时找不到,然后就不会进行初始化。由于初始化不会发生,控制器中会有垃圾值/错误。因此,最好将控制器初始化与视图分离

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


    希望这对您有所帮助。

    谢谢Umair,根据您的回答,我没有什么顾虑。1.如果不进行初始化,则说明垃圾值在控制器中的持久性。你能详细说明你的意见吗。2.我想你不明白我的问题第三点。如果有人对我的担忧发表评论,那就好了。第一点:如果没有找到你的观点,那么这一行。。。。不会进行计算,这就是为什么控制器中执行ajax请求并将数据设置为$scope属性的方法不会运行,而您将一无所获。我说“垃圾”的意思是你什么都得不到。更好的方法是在编写函数定义之后直接在控制器中调用函数。这样,您的ajax请求肯定会执行。我想这也是你第二点的答案。现在告诉我您对第3点有什么顾虑?如果找不到我的视图,则我的控制器未针对该视图初始化。在任何情况下,我的initIndustries函数都不会同时调用这两种情况(通过HTML或控制器内部的调用),而且我的ajax请求也不会执行。你的建议没有解决我的问题(第一点和第二点)。这是不正确的。如果没有找到视图,并且在控制器中定义了initIndustries()函数之后调用了该函数,那么无论是否没有找到该控制器的视图,ajax请求都将执行。这就是为什么它比通过视图初始化更好的方法。希望这能回答您的前两点。目前,您的控制器并不完全依赖于视图,而只依赖于您的ajax调用。但使用我所说的方法,它将使控制器完全独立于视图。这就是我认为这种方法更好的原因
    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.
    }
    }])