Asp.net mvc 这是否正确使用了ng init?
我有一个使用angularjs的MVC应用程序 (我显然过于简化了) 首先,我的控制器有以下功能: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
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
}]);