Javascript AngularJS解析的值是否不正确?

Javascript AngularJS解析的值是否不正确?,javascript,angularjs,Javascript,Angularjs,我这里有一个非常简单的例子: 要尝试它,只需转到小提琴并单击[Add Item]按钮添加一些行 接下来,单击任何项目旁边的复选框,您将看到类似以下内容: 问题:仅显示数字部分 问题是该值应该显示行中显示的整个字符串。在本例中,这意味着它应该显示:86884-LLMUL。 请注意,它仅显示值的数字部分 如果您查看该控件,您将看到我使用的是type=“text”输入。 此外,如果查看模型(simpleItem)对象,您将看到它的一个属性是字符串。 模型类的JavaScript如下所示: fun

我这里有一个非常简单的例子:

要尝试它,只需转到小提琴并单击[Add Item]按钮添加一些行

接下来,单击任何项目旁边的复选框,您将看到类似以下内容:

问题:仅显示数字部分 问题是该值应该显示行中显示的整个字符串。在本例中,这意味着它应该显示:86884-LLMUL。 请注意,它仅显示值的数字部分

如果您查看该控件,您将看到我使用的是type=“text”输入。 此外,如果查看模型(simpleItem)对象,您将看到它的一个属性是字符串。 模型类的JavaScript如下所示:

  function simpleItem(id) {
        this.id = id;
    }
我尝试强制输入字符串类型的尝试 当我生成每个simpleItems时,我甚至在调用构造函数时将它们设置为一个字符(只是强制将id设置为字符串类型)

下面是初始化每个simpleItem ID的代码:

currentItem.id = getRandom(100000).toString() + "-" + getRandomLetters(5).toUpperCase();
您可以在fiddle中看到其余的代码,但问题是我生成了一个随机值,并用连字符和5个字母将该值连接在一起。对于这个示例来说,这只是一段愚蠢的小代码

但现在,这里是它变得非常奇怪的部分。 如果我只是简单地将连字符改为另一个字符,比如大写的X,那么每次单击复选框时都会出现一个错误。 以下是修改后的代码和新输出,您可以在修订后的fiddle上看到:

此外,现在如果在浏览器中打开Dev Tools,您将在控制台中看到Angular现在在每次单击[Add Item]按钮时都报告错误。它看起来像:

添加单引号?修复?它 如果转到HTML并从此处更改以下行:

ng-init="itemId ={{l.id.toString()}}" 
对此

ng-init="itemId ='{{l.id.toString()}}'" 
现在,当您运行它时,错误将消失,它将像您在更新的小提琴上看到的那样工作:

角度:将连字符转换为减号? 你看,Angular似乎正在将其转换为数字,尝试对其进行数学运算(将连字符解析为减号),然后截断字符串部分。当我使用连字符时,这一切似乎都起作用,但当我使用X时,则会出现角度阻塞

下面是添加单引号时的情况—当然,Dev工具控制台中的角度错误也会消失。

将角力转换为数字类型? 为什么会发生这种情况?这就好像它试图将我的字符串值强制为数字,即使输入元素是text类型,JavaScript变量是string类型。 有人对此有想法吗

星号(乘法符号)怎么办?

就在我完成这项工作的时候,我想知道如果我将-改为a*并再次运行它会发生什么。这一次我看到了下面的错误,这表明有东西正试图转换为数字


这是预期的行为。Angular只是将作用域中的文本插入到
ng init
表达式中,然后执行该表达式。这与周围上下文其余部分的
输入
框的类型关系不大


Angular将它所做的任何插值都封装在
引号中肯定是不可取的,它会中断在所有其他地方的使用,例如
class=“my class{{dynamic class}}”
ng init
需要一个角度表达式。你不必用花括号。你可以这样简单地写:

ng-init="itemId=l.id" ng-click="checkBoxClicked(itemId)"

将ng init替换为

ng-init="itemId =l.id.toString()"

在接下来的文档中,您应该只在特殊情况下使用init,无论如何,您应该依靠您的控制器来实现这一点

我想我们只是被Angular的古怪弄糊涂了。基本上,你给angular一个字符串,它正在转换成一个javascript表达式,因为它在{{}中。它已经显式地是一个字符串(在双引号之间):

ng init=“itemId={{l.id.toString()}}”

它显然忽略了这样一个事实,即您正在用
l.id.toString()
说“嘿,不,真的,这是一个真正的字符串”。它不在乎。它已经是一个字符串,并将对其求值

只用单引号

如果您
ng init itemId={{undefined===undefined}
,您希望发生什么?(它在警报中打印“true”)


与此相同:(undefined===undefined在引号中)
nginititemid={{{'undefined==undefined'}
;在警报中显示为真。

这正是我想知道的答案。我现在正在学习Angular,因此我花了相当长的时间来确定如何初始化变量,并且在这一过程中,我不知怎么地得到了语法错误,但它仍然“有效”。如果你能这么说的话。感谢您注意到发生了什么。因为我现在正在学习Angular,所以我尝试初始化变量,但无法使其正常工作,于是我开始思考必须添加{{}指令才能完成此操作。这是我的一个错误,然后当我沿着这条路走的时候,我对正在发生的事情变得更加困惑。lex82和Charlie Brown解释说我不需要在ng init中使用该指令,这真的找到了答案。这是一个有趣的副作用,你不觉得吗?当然。我也在一条类似的船上——也许只有大约3周的时间。
ng-init="itemId =l.id.toString()"