【问题标题】:AngularJS: passing boolean value to directiveAngularJS:将布尔值传递给指令
【发布时间】:2015-09-08 05:24:11
【问题描述】:

我无法将 布尔值 传递给我的指令。

这是我的 HMTL:

<city-zip city="clientCity" zip="clientZip" requiredParam="'true'"></city-zip>

和指令:

.directive('cityZip', function() {
    return {
        restrict: 'E',
        templateUrl: '../templates/templateCityZip.html',
        scope: {
            city: '=',
            zip: '='
        },
        controller: function($scope) {}
    }
});

任何帮助将不胜感激。

【问题讨论】:

  • 只需创建一个范围变量来检查这一点。无需作为字符串传递。你应该作为变量传递

标签: angularjs angularjs-directive


【解决方案1】:

HTML

<city-zip city="clientCity" zip="clientZip" required-param="true"></city-zip>
<city-zip city="clientCity" zip="clientZip" required-param="{{ someBooleanValue }}"></city-zip>

角度

.directive('cityZip', function() {
    return {
        restrict: 'E',
        templateUrl: '../templates/templateCityZip.html',
        scope: {
            city: '=',
            zip: '=',
            requiredParam:'@'
        },
        link: function(scope) {
            console.log("requiredParam", scope.requiredParam);
        }
    }
})

【讨论】:

  • 对不起,这个返回未定义。
  • 现在检查,编辑 'required-param=',是 'requiredParam='
  • 我已经改变了这个。你能看看我关于 ng-required 的底部评论吗?
  • @DmitriAlgazin 的评论救了我。我一直忘记在 Angular 中他们使用 camelCaseNames 并使它们变得非常奇怪。
  • @silencedmessage 又名“蛇盒”
【解决方案2】:

我认为这个问题尚未包含最简单/最干净的答案。这个答案也适合布尔属性的 HTML5 规范 - http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes

2.5.2 布尔属性

许多属性是布尔属性。一个的存在 元素的布尔属性 代表真值,而 属性的缺失代表 假值。

如果属性存在,它的值必须是空字符串 或一个 ASCII 值 不区分大小写的匹配 属性的规范名称,没有 前导或尾随空格。

布尔属性不允许使用值“true”和“false”。到 表示一个假值,该属性 必须完全省略。

HTML:

<city-zip city="clientCity" zip="clientZip" requiredParam></city-zip>

还有指令:

.directive('cityZip', function() {
    return {
        restrict: 'E',
        templateUrl: '../templates/templateCityZip.html',
        scope: {
            city: '=',
            zip: '='
        },
        controller: function($scope, $attrs) {
            $scope.requiredParamExists = $attrs.hasOwnProperty( 'requiredParam' );
        }
    }
});

简单,完全符合用于布尔属性的 HTML5 规范,无需将字符串强制转换为范围变量 ('requiredParam': '=')。

请注意,在上面的示例代码中,如果缩小,所需的变量 $scope$attrs 将变为较短的字符串并破坏代码,但这是另一个问题。

【讨论】:

  • 这个实现的大问题是如果你想在你自己的组件中使用具有这种类型的属性模板的组件,同时动态地包含或不包含该属性。例如,如果您想动态关闭或打开 ui-select 的“multiple”属性,而无需重复 HTML 元素并使用 ng-if。仅基于此,我个人建议不要在此答案中使用该模式。
  • @sean2078 我没有完全跟踪,因为我已经有一段时间没有处理这个问题了。您能否举一个问题的例子和/或您发现的更好的工作方式,以供后代使用?
  • @sean2078 你只需要使用ng-attr- 这个。
  • 我最终采用了这种方法。比我看到的所有其他东西更简单,而且我正在处理的指令不是使用隔离范围实现的。孤立的范围似乎打破了它,所以就是这样。谢谢!
【解决方案3】:

link内,可以访问属性:

return {
    // code
    link: link
}

function link(scope, $el, attrs) {
    var requiredParam = attrs.requiredParam === 'true';
}

这会将字符串值强制为布尔值(如果字符串值为'true',它将返回true,否则将返回false。)

这里的主要部分是如何将字符串值“true”或“false”转换为其布尔形式,因为!!'true'!!'false' 都返回true。有关解决方案和扩展讨论,请参阅this answer

如果您需要在控制器中使用该值,您可以在 scope 对象中执行相同的模式,并将其以强制形式传递给耦合控制器。

【讨论】:

  • @JBNizet,是的,我刚刚意识到,我在您发表评论之前更改了答案(现在是 var requiredParam == attrs.requiredParam === 'true'
  • 感谢您的回答。我的指令不起作用,可能是因为同时链接和控制器?你能指出我如何在控制器中做到这一点吗?我什至不知道为什么要链接。
  • @Zigson,我建议阅读 AngularJS 文档以获取指令,它为如何使用链接提供了很好的解释。
【解决方案4】:

您可以在链接函数中传递 3 个参数,这些参数适用于指令。参数为scopeelementattributes

  1. scope 给出了指令所在的控制器的范围。

  2. element 传递有关应用它的 DOM 元素的信息

  3. attributes 传递有关元素上所有 DOM 元素属性的信息。

    <city-zip ng-app="myapp" city="clientCity" zip="clientZip" required-param="true"></city-zip>
    
    angular.module("myapp", []).directive('cityZip', function() {
    return {
        restrict: 'E',
        templateUrl: '',
        scope: {
            requiredParam:'@'
        },
        link: function(scope, $el, attrs) {
            alert( attrs.requiredParam);
        }
    }
    

    })

工作jsFiddle

【讨论】:

  • 感谢您的努力。我确实得到了真或假,但不知何故,我认为这不是真正的布尔值。我在指令模板中使用 ng-required="requiredParam":尽管 ng-required 设置为 true,但我收到验证错误。
  • 这行得通,我忘了绑定 requiredParam(把它们放在大括号里)。
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 2017-12-16
  • 2014-06-10
  • 1970-01-01
  • 2013-01-15
  • 2015-08-31
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多