【问题标题】:AngularJS Directive Passing StringAngularJS 指令传递字符串
【发布时间】:2014-01-26 21:08:38
【问题描述】:

该指令试图创建一个称为进度条的 HTML 元素,该元素在您移动页面时跟踪进度。我正在尝试开发它以用作: <progress-bar progress='1' max='6' error="true"></progress-bar>

我只是试图将 html 中的 ^^ 元素中的信息传递给我的指令并处理信息以适当地更改进度条。

这适用于采用整数值的“progress”和“max”,但由于某种原因,注释掉的代码会处理“error”(这是一个字符串)导致问题。我是 angularJS 的新手,所以如果这听起来令人困惑或不清楚,我很抱歉......请询问我是否需要详细说明/澄清。提前致谢!

app.directive('progressBar', function(){

var compileProgressBar = function(scope, elem, attrs) {
    var append = '<nav class="navbar navbar-fixed-bottom navbar-footer" role="navigation">\
                    <div class="container">\
                        <div class="row">';
    var i = 1;
    while (i <= parseInt(scope.max)) {
        if (i <= parseInt(scope.progress)) {
            //if (scope.error == "true"){
                //...
            //}
            //else {
            append += '<div class="col-xs-1"><div class="circle-filled"><center>'+i+'</center></div></div>'
            //}
        } else {
            append += '<div class="col-xs-1"><div class="circle-hallow"><center>'+i+'</center></div></div>'
        }
        i++;
    }
    append += '</div></div></nav>'
    elem.append(append);
    elem.bind('click', function(){
        if (scope.progress > 1) {
            history.back();
            scope.$apply();
        }
    });
}

return {
    restrict: 'AE',
    scope: {
        max: '=max',
        progress: '=progress'
        //error: '=error'
    },
    link: compileProgressBar
}

});

【问题讨论】:

  • 什么是history.back();
  • 你确定错误是不是布尔值的字符串吗?
  • history.back() 将返回功能添加到进度条 - 当您单击进度条时,它的作用类似于单击浏览器上的返回按钮。这工作正常。另外,您是正确的,错误应该是布尔值。但是,我仍然不明白如何将布尔值从 html 传递到指令:/ 再次,非常感谢
  • 试试这个if (scope.error ){
  • 我认为您在该语句之前缺少一个逗号

标签: javascript string angularjs angularjs-directive parameter-passing


【解决方案1】:

在您的指令中,您正在使用从全局范围到指令本地范围的属性的双向绑定。

在这种模式下,html 中的属性值被评估为表达式,因此您的指令尝试将其本地 scope.error 绑定到评估 true 的结果作为表达式。

当您测试 scope.error == "true" 时,您实际上是在测试 true == "true",这在 javascript 中评估为 false

要解决您的问题,您可以:

  • 在调用指令时使用带引号的字符串:

    <progress-bar progress='1' max='6' error="'true'"></progress-bar>
    
  • 或更改指令中的绑定模式,因为您不需要双向绑定。 @ 变量始终是字符串类型。

    return {
        restrict: 'AE',
        scope: {
           max: '@max',
           progress: '@progress',
           error: '@error'
        },
        link: compileProgressBar
    }
    

您可以在Angular $compile documentation找到更多关于绑定模式的信息

【讨论】:

  • 这非常有用;非常感谢。但是,问题还不是比较测试评估不正确......由于某种原因,当我取消注释 error: '=error' 时,我的网站崩溃了。由于某种原因,这条线导致了问题,将其更改为error: '@error' 并没有解决问题。很高兴知道我当前的代码将测试 true == "true" 如果我到了那个阶段,那么再次感谢上面的提示
  • 我假设您在取消注释错误时在进度后添加逗号以避免琐碎的语法错误。取消注释该行时您的控制台错误是什么?
  • 哇.. 新秀失误!!感谢 rluta,预见了我的真正问题并确定了我当前/愚蠢的问题。解决了。非常感谢。
  • 谢谢。这些东西应该在docs.angularjs.org/guide/directive的文档中提到。
  • 感谢您的评论,终于解决了我的问题。我试图将“+1”作为指令属性值传递,它被转换为数字 1。因为我不需要双向切换绑定模式是一个很好的解决方案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多