我有一个使用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的好习惯吗?
我没有找到任何其他方法来做到最佳和干净。
由于
答案 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
}]);