Asp.net mvc 这是否正确使用了ng init?

Asp.net mvc 这是否正确使用了ng init?,asp.net-mvc,angularjs,Asp.net Mvc,Angularjs,我有一个使用angularjs的MVC应用程序 (我显然过于简化了) 首先,我的控制器有以下功能: function MyController() { $scope.myInit = function() { $http.get("ShowData").success(function() { $scope.mything = 123; }); } // so once all my controll

我有一个使用angularjs的MVC应用程序

(我显然过于简化了)

首先,我的控制器有以下功能:

function MyController()
{
    $scope.myInit = function()
    {
         $http.get("ShowData").success(function() {
             $scope.mything = 123;
         });
    }

    // so once all my controller is defined, I call the init method
    $scope.myInit();
}
我的视图有以下代码

@if (AllowToShowData)
{
<div><span ng-bind="{{mything}}" /></div>
}
@if(AllowToShowData)
{
}
注意:http.get over和AllowToShowData是通过相同的权限连接的。因此,如果AllowToShowData为false,那么http.get也将失败

如您所见,如果AllowToShow为true,MVC将渲染该部分。如果没有,它将不会呈现,但代码仍将调用myInit方法,该方法最终也将失败

因此,为了避免这种情况,我删除了控制器中对myInit的调用,并将视图更改为:

@if (AllowToShowData) 
{
<span ng-init="myInit()"></span>
<div><span ng-bind="{{mything}}" /></div>
}
@if(AllowToShowData)
{
}
这样,只有在允许和需要时才会调用myInit方法

问题基本上是:这对于ng init是一个好的实践吗

我没有找到任何其他的方法来做这件事,这是最佳的和干净的


谢谢

Angularjs文档不建议使用ng init

我不喜欢对配置值进行额外的ajax调用。因此,我建议采取以下方式

在视图中,为控制器放置一个配置部分。像这样的

@section scripts
{
    <script>
        var model = {
            allowToShowData: @AllowToShowData.ToString().ToLower()
        };
    </script>
}
为了改进代码风格,我建议使用方法
controller
来创建控制器

angular
    .module("yourModuleName")
    .controller("yourControllerName", ["$window", function($window) {
        //your controller code
    }]);

请参阅此处的更多详细信息。

我认为,正确的做法是将AllowToShowData和其他类似配置公开为api,创建一个从服务器加载该数据的服务,然后让控制器注入该服务。我发现混合使用服务器和客户机模板很难维护,因为您永远无法确定错误是源于服务器还是客户机代码。出于同样的原因,我也避免使用ng init,并将所有范围管理放在控制器内。我更喜欢这样做,因为我希望在服务器端处理授权权限,并且只将最终值(allowX、doNotAllowY)呈现到浏览器中。我肯定已经使用angular.controller,这只是为了简短:)我喜欢你的解决方案,我会简单地通过将模型重命名为另一个更具体的名称来改进这一点,因为一旦你通过此页面,“全局”对象模型将处于活动状态,因此可能会有问题,因为其他地方也可能使用此名称。我不喜欢的是两种不同范式的混合:angular和plain javascriptI。我刚刚意识到:由于ASPNET MVC视图反映为angularjs路由,这些路由被缓存在$templateCache中。因此,此窗口/作用域逻辑的任何使用都可能遇到问题。在我的例子中,标志根据授权规则获取其真/假值,因此不应该存在问题,因为单页应用程序实例是每个用户的,如果他注销,如果您对页面进行完全刷新,将获得一个“新实例”。
function MyController($window)
{
    $scope.allowToShowData = $window.model.allowToShowData;
    $scope.myInit = function()
    {
         $http.get("ShowData").success(function() {
             $scope.mything = 123;
         });
    }

    if ($scope.allowToShowData) {
        $scope.myInit();
    }
}
angular
    .module("yourModuleName")
    .controller("yourControllerName", ["$window", function($window) {
        //your controller code
    }]);