Angular - 一些属性需要显式绑定到$ scope,其他Don?#?

时间:2015-11-10 20:07:32

标签: angularjs

以下是一些有效的代码(瞥了一眼就足够了):

<div ng-repeat = "n in lotteryNumbers" ng-if="doShowExample">
    <input type="text" value = "{{lotteryNumbers[n]}}"></input>
</div>

<script>
angular.module('app', [])
        .controller('testCtrl', function($scope) {
            $scope.doShowExample = true;
            $scope.lotteryNumbers = [1,2,3,4,5,6,7,8,9,10];
        });
</script>

我们在这里看到两个属性已赋值:

ng-if="doShowExample" 

value = "{{lotteryNumbers[n]}}"

我并不真正理解一个属性的价值背后的逻辑需要被置于花括号(ng-model)中而另一个属性被束缚。为什么它有时会自动知道您正在寻找变量而不是显式值?

Plnkr如果你想要它,但没有什么有趣的。就在这里,万一我错了,你想告诉我如何。

2 个答案:

答案 0 :(得分:4)

那是因为value不是角度指令,但它只是元素的一个属性,可以赋值,它不知道角度表达式是什么。因此,在表达式上提供插值(&#39; {{...}}&#39;)会导致将表达式的结果赋值给文本框的值。但是你很少需要这样做,如果你需要提供价值,你也可以使用角度指令ng-value

   <input type="text" ng-value= "lotteryNumbers[n]"></input>

但是大多数情况下你需要ng-model进行双向绑定。

   <input type="text" ng-model= "lotteryNumbers[n]"></input>

所以简而言之

  

{{AngularExpression_XYZ}} - &gt; AngularExpression_XYZ的值

当你看到一个期望表达式的angular指令时,你需要提供表达式本身,对于ex - ng-if, ng-repeat, ng-show以及更多......但是如果你看到某些东西取值例如:{{ 1}}你需要为它提供一些值,你可以通过插值来实现它。

现在来看你的示例中的内容你做错了ng-attr-x来自你的案例中的ng-repeat表达式(lotteryNumbers[n])中的n不是索引但它本身就是价值。但是,由于你有数组,并且你希望"n in lotteryNumbers"能够正确使用ng-repeat数组,你可能会尝试使用ng-model而且你需要使用track by expression本身,因为它最终会在数组更新时失去对文本框的关注。

$index

但在真实用例中,你应该尽量避免这种情况并将其绑定到对象数组,以避免出现此类问题。

答案 1 :(得分:1)

在你的例子中

ng-if

是一个将范围变量传递给。

的角度指令
value

是标准的html属性 - &gt;它不能接受范围变量。它只能处理“值”,因此您必须使用{{var}}。