带有剃刀表达式的ng-init

时间:2013-12-13 09:57:44

标签: javascript angularjs razor

我试图渲染这样的东西:

<thead ng-init="isDoctor = @(User.IsInRole("Doctor"))">

我希望它是“isDoctor = true | false”(我的服务器端代码呈现此模板返回PartialView),顺便说一下我总是得到如下错误:语法错误:令牌'undefined'不是主表达式at at从[isDoctor = at Error()] 开始的表达式[isDoctor =]的列null。那么,原因是什么?

2 个答案:

答案 0 :(得分:7)

尝试这种方式:

<thead ng-init="isDoctor = @(User.IsInRole("Doctor") ? "true" : "false")">

因为C#boolean呈现大写第一个字母:

<thead ng-init="isDoctor = True|False">

TrueFalse未定义

答案 1 :(得分:2)

或者,您可以考虑以下事项:

<script type='text/javascript'>

    angular.module('my-module')
        .value('isDoctor', @(User.IsInRole("Doctor") ? "true" : "false"))
        // perhaps other values that need passed in from the server?
        .constant('aValue', '@Model.AValue') // for example
        ;

</script>

这不会将值直接放在像ng-init那样的范围内;但是,它为您提供了一个可注入的值,您可以在控制器,服务,指令等中使用它,实际上是一个运行时配置变量:

// some script somewhere
angular.module('my-module').controller('myController', [
    '$scope',
    'isDoctor',
    function($scope, isDoctor) {
        $scope.isDoctor = isDoctor;

        // other controller code here
    }]);

关于从Razor到Angular传递数据的这种风格的好处是,如果你忘记这样做,Angular的依赖注入将引发错误,因为实例化myController需要定义isDoctor。它将可能是运行时错误的东西移动到一个配置/编译错误中,这个错误应该相对容易纠正。

它还在Razor(cshtml)文件中为您提供了一个位置,您可以将服务器端参数传递到Angular运行时,这样可以减少杂乱,特别是如果您的HTML标记有很多指令和插值。