为什么当你在角度使用ng-src时你必须使用表达式?

时间:2014-06-22 06:05:12

标签: angularjs

NG-SRC =' {{item.img [0]}}'

当...

其他指令只需要像ng-show =' item.val'

这样的字符串

我不确定为什么在某些情况下使用表达式以及为什么字符串在其他情况下?

2 个答案:

答案 0 :(得分:4)

这就是它实施的方式。

选择使用插值表达式的原因是它允许您这样做:

ng-src="http://my.generic.url/some/resource/{{IDdefinedInScope}}"

如果它不使用插值,你必须这样做:

ng-src="'http://my.generic.url/some/resource/' + IDdefinedInScope"

或那:

ng-src="someResourceUrl(IDdefinedInScope)"

$scope.someResourceUrl = function (id) {
    return 'http://my.generic.url/some/resource/' + id;
};

(...更冗长,更狡猾,更少陈述。)


<子> 在cource中,这使得这可能是输出需要一个字符串(而不是一个对象)。

答案 1 :(得分:2)

我自己也想知道这件事。继源之后,我们回到了角度处于婴儿期的时候。这是在他们的第一个0.9版本之前的大约100个提交:9627c4b50e,问题#11

事实证明,没有扩展的提交消息,也没有任何问题消息。代码位于/src/markups.js的底部,源代码中的注释很少,绝对不是任何类型的文档。所以以下只是我的猜想,可能不准确。

似乎在角度的早期阶段,他们定义了大约6种不同的工具:指令,过滤器,格式化程序,标记,验证器和小部件。在进行一些提交时,我发现了这些定义:

  • 指令为DOM元素创建自定义属性,但不向dom添加元素。
  • 小部件可以创建修改现有DOM元素的自定义属性,也可以创建全新的DOM元素。
  • 过滤器用于格式化显示给用户的数据。
  • 格式化程序用于在用于显示的数据格式和用于存储的格式之间转换数据格式。
  • 验证器用于根据定义的类型或模式检查用户输入。
  • 标记将DOM元素的内容或此内容的某些部分转换为其他文本或DOM元素。

此时Directives / Widgets使用了表达式,Markups使用了{{interpolation}},过滤器使用了一个管道。插值内部,Formatters / Validators使用纯文本。 ng-href和ng-src属于标记类别。

与现在(1.3)相比,指令,窗口小部件和标记现在合并为指令。过滤器和格式化程序现在只是过滤器,而验证器位于表单元素的ngModelController中。

由于这种迁移,他们不得不决定如何处理标记。他们将很多布尔标记(ng-checked / multiple / readonly / selected / disabled)更改为表达式,但决定将ng-src和ng-href保持为插值。您可以找到a discussion on google groups where Misko Hevery explains the exception

因此它源于早期的分类,并且为了简单或向后兼容而持续存在。