Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular JS指令不更新范围变量_Javascript_Angularjs - Fatal编程技术网

Javascript Angular JS指令不更新范围变量

Javascript Angular JS指令不更新范围变量,javascript,angularjs,Javascript,Angularjs,我试图在angularJs中构建一个简单的指令,它通过属性接受一些配置选项,但是如果没有设置属性,我想为属性设置默认值 以下是我如何描述我的工作范围: scope : { classes: '@', progress: '@' } 这些属性以以下方式显示在视图中: <div class="{{classes}}"> <div style="width: {{progress}}%;" class="b

我试图在angularJs中构建一个简单的指令,它通过属性接受一些配置选项,但是如果没有设置属性,我想为属性设置默认值

以下是我如何描述我的工作范围:

scope :  {
            classes: '@',
            progress: '@'
         }
这些属性以以下方式显示在视图中:

<div class="{{classes}}">
    <div style="width: {{progress}}%;" class="bar"></div>
</div>
以下是控制台输出:

undefined undefined
progress progress-warning 99
因此,似乎在范围内正确设置了值。但是,在实际的html输出中,不会呈现属性。以下是生成的HTML:

<div class="">
    <div class="bar" style="width: %;"></div>
</div>

但是,如果我在从html调用属性时内联提供这些属性,例如:

<my-directive data-progress="60" data-classes="progress" />

然后它会很好地显示出来:

<div class="progress" data-progress="60" data-classes="progress">
    <div class="bar" style="width: 60%;"></div>
</div>

我的问题是,当我只调用
时,为什么不从link函数中设置进度和类的默认值?(尽管在控制台中显示确实如此)

将范围更改为

scope: {
  ngModel: '@'
}
试试这个:

if (typeof scope.progress === 'undefined') {
       attrs.$set('progress', 99);
}
link: function(scope, element, attrs) {
    scope.classes = attrs.classes || 'progress progress-warning';
    scope.progress = attrs.progress || 99;
}
并设置:

<div class="bar" style="width: {{progress}}%;"></div>

看这个。如果未声明
数据进度
,或者如果
数据进度=”
尝试以下操作,则将设置
99

if (typeof scope.progress === 'undefined') {
       attrs.$set('progress', 99);
}
link: function(scope, element, attrs) {
    scope.classes = attrs.classes || 'progress progress-warning';
    scope.progress = attrs.progress || 99;
}
您可以放弃指令的
作用域:{classes:'@',progress:'@}
部分


我看你写指令有点困难。看看我最近实现的。也许它会帮助您总结您的工作。

您是否尝试使用scope.$apply()?如果可以,发布一个plunker或fiddle?您不需要执行
范围。$apply()
您可以发布完整的指令吗?@DeividiCavarzan如果我将代码放在范围内的link函数中,我会得到
摘要。$applyOk我的错,我没有看到您正在更改link函数。这是可行的,但问题是,现在,如果我尝试在标记中指定属性,例如,
没有任何效果,并且它仍然停留在进度上,作为99,这是没有给定值时的默认值。这是我尝试此操作时的输出:
@ClickUpvote我已经更新了plunker,以便在更改值时查看div宽度。在本例中,我将{{progress}}插入到宽度声明中。这就是您要寻找的吗?当您包含指令时,您已经提供了进度。您正在执行
。如果我这样做,它也对我有效,但是我想要的是简单地执行
,并将其设置为
progress
classes
,其中包含一些默认值case@ClickUpvote但如果删除属性,它也会起作用。。。我现在已删除并使用默认值。。。你能再查一下吗?太好了。谢谢我之前问过的指令现在可以正常工作了,这只是针对其他指令。当我执行
attrs.progress
时,为什么我在
attrs.progress | 99
时没有在
attrs.progress
上得到未定义的错误?此语句检查变量是否为
null
未定义
,如果为true,指定第二个值。@DeividiCavarzan有趣的是,我认为有必要检查
typeof
。它在IE中也可以工作,还是只在firefox/chrome中可以工作?实际上,它检查任何计算结果为
false
,而在Javascript中,许多事情都是这样做的(包括null和未定义)。出于显而易见的原因,它仅适用于非布尔值。