这是否正确使用ng-init?

时间:2015-03-26 05:21:43

标签: asp.net-mvc angularjs

我有一个使用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>
}

注意:上面的http.get和AllowToShowData通过相同的权限连接。因此,如果AllowToShowData为false,http.get也将失败。

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

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

@if (AllowToShowData) 
{
<span ng-init="myInit()"></span>
<div><span ng-bind="{{mything}}" /></div>
}

这样,只有在允许和需要时才会调用myInit方法。

问题基本上是:这是ng-init的好习惯吗?

我没有找到任何其他方法来做到最佳和干净。

由于

1 个答案:

答案 0 :(得分:3)

Angularjs文档不建议使用ng-init https://docs.angularjs.org/api/ng/directive/ngInit

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

在视图中为控制器添加配置部分。像这样的东西

@section scripts
{
    <script>
        var model = {
            allowToShowData: @AllowToShowData.ToString().ToLower()
        };
    </script>
}

并将html片段渲染为

<div ng-if="allowToShowData"><span ng-bind="mything" /></div>

在角度控制器中,您从模型中获取标志值,并根据标志值进行调用,并将标记存储到$scope以便在ng-if指令中使用。

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

    if ($scope.allowToShowData) {
        $scope.myInit();
    }
}

为了改进代码风格,我建议使用方法controller来创建控制器

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

在此处查看更多详情https://docs.angularjs.org/guide/controller