0

我创建了一个自定义指令,我想在整个应用程序中使用它来显示 ModelState 错误(从 MVC Web api 抛出),但错误未显示在自定义指令生成的 html 片段中,但显示错误 div 时没有任何消息。请帮我。

cmApp.directive("modelError", function () {
    return {
        restrict: 'E',
        replace: true,
        scope: {
           errors: '@'
        },
        template: '<div class="row">' +
                    '<br />' +
                    '<div class="span10">' +
                        '<div class="alert-error alert" ng-show="errors" ng-switch="errors.length">' +
                          '<strong>Error!</strong>' +                              
                          '<ul ng-switch-default>' +
                            '<li ng-repeat="error in errors">{{error}}</li>' +
                          '</ul>' +
                        '</div>' +
                    '</div>' +
                '</div>',
    };
});

html代码:

<model-error errors="{{modelErrors}}"></model-error>

控制器代码:

$scope.modelErrors = validationService.getModelErrors(response);

我只看到“错误!” div 但不是错误消息。

4

1 回答 1

1

您不需要在传入属性值之前进行插值:

<model-error errors="modelErrors"></model-error>

另外,尝试将隔离范围类型更改为=

scope: {
       errors: '='
},

来自稳定指令文档

范围 - 如果设置为:

true - 然后将为此指令创建一个新范围。如果同一元素上的多个指令请求一个新范围,则只会创建一个新范围。新的范围规则不适用于模板的根,因为模板的根总是获得一个新的范围。

{}(对象哈希) - 然后创建一个新的“隔离”范围。“隔离”作用域与普通作用域的不同之处在于它在原型上并不从父作用域继承。这在创建可重用组件时很有用,这些组件不应意外读取或修改父范围内的数据。“隔离”作用域采用对象散列,该散列定义了一组从父作用域派生的局部作用域属性。这些本地属性对于模板的别名值很有用。Locals 定义是本地范围属性到其源的哈希:

@ 或 @attr - 将本地范围属性绑定到 DOM 属性的值。结果始终是字符串,因为 DOM 属性是字符串。如果未指定 attr 名称,则假定属性名称与本地名称相同。给定范围的小部件定义:{ localName:'@myAttr'},然后小部件范围属性 localName 将反映 hello {{name}} 的插值。随着 name 属性的变化,小部件范围上的 localName 属性也会发生变化。该名称是从父范围(不是组件范围)读取的。

= 或 =attr - 在本地范围属性和通过 attr 属性值定义的 name 的父范围属性之间建立双向绑定。如果未指定 attr 名称,则假定属性名称与本地名称相同。给定范围的widget定义:{localModel:'=myAttr'},那么widget范围属性localModel将在父范围上反映parentModel的值。对 parentModel 的任何更改都将反映在 localModel 中,而对 localModel 的任何更改都将反映在 parentModel 中。

& 或 &attr - 提供一种在父作用域的上下文中执行表达式的方法。如果未指定 attr 名称,则假定属性名称与本地名称相同。给定范围的小部件定义:{ localFn:'&myAttr'},则隔离范围属性 localFn 将指向 count = count + value 表达式的函数包装器。通常希望通过表达式将数据从隔离范围传递到父范围,这可以通过将局部变量名称和值的映射传递到表达式包装器 fn 来完成。例如,如果表达式是 increment(amount),那么我们可以通过将 localFn 调用为 localFn({amount: 22}) 来指定数量值。

于 2013-10-29T23:41:38.423 回答