为什么ng模型有时会预先填充,有时不会?

时间:2015-04-07 09:33:06

标签: angularjs

为什么会出现默认值?我以为它只是应该将一个元素绑定到一个scope属性。我没有意识到它与预填充有任何关系。为什么第一个文本框预先填充在这里,而不是第二个?

http://jsfiddle.net/ubwa4jgs/

... JS

    angular.module('epfApp', [])
.controller('MainCtrl', function ($scope, $window) {

    $scope.questions = {
        '1': {
                'title': 'Why does a default value work here?',
                'type': 'text',
                'default': 'first question'
            } 
    };

    $scope.myChange = function() {
        console.log("a change just occurred");
    };

});

HTML ...

    <div ng-controller="MainCtrl">
    <label ng-repeat="question in questions">
        {{question.title}}
        <input type="text" ng-model="question.default" ng-change="change()" />
        <br />
    </label>
        <br />
    <label>
        Why does a default value NOT work here:
        <input type="text" ng-model="banana" ng-change="change()" />
        <br />
    </label>    

</div>

编辑:我很感激答案。我认为这是转发器让我失望。对于每个元素,ng模型值是否必须是唯一的?我知道这是错的,但我觉得我需要'ng-model =“question.default {{$ index}}”'或某些东西来强制分配给ng-model的东西是唯一的。

编辑2: 我认为指令的工作是修改DOM。查看源代码后,我看到dom已被修改,添加了各种类和注释,但ng-model值仍然相同(question.default),也就是说,它们仍然依赖于ng-repeat指令使它们独一无二。因此,ng-repeat似乎是一个例外,因为暗示了ng-model的唯一(索引)名称,但技术上并没有在DOM中实际反映出来?

更新http://jsfiddle.net/ubwa4jgs/

<div ng-controller="MainCtrl" class="ng-scope">
    <!-- ngRepeat: question in questions --><label ng-repeat="question in questions" class="ng-scope ng-binding">Why does a default value work here?
        <input type="text" ng-model="question.default" ng-change="myChange()" class="ng-pristine ng-valid">
        <br>
    </label><!-- end ngRepeat: question in questions --><label ng-repeat="question in questions" class="ng-scope ng-binding">Why does a default value work here too?
        <input type="text" ng-model="question.default" ng-change="myChange()" class="ng-pristine ng-valid">
        <br>
    </label><!-- end ngRepeat: question in questions -->
    <br>
    <label>Why does a default value NOT work here:
        <input type="text" ng-model="banana" ng-change="myChange()" class="ng-pristine ng-valid">
        <br>
    </label>
</div>

2 个答案:

答案 0 :(得分:2)

因为没有$scope.banana值。 Fiddle

angular.module('epfApp', [])
.controller('MainCtrl', function ($scope, $window) {

    $scope.questions = {
        '0': {
                'title': 'Why does a default value work here?',
                'type': 'text',
                'default': 'first question'
            } 
    };

    $scope.banana = "yellow";

});

&#34;为什么会出现默认值?&#34; - AngularJS two-way Data Binding

关于你的编辑,你应该有这样的东西:

<label ng-repeat="question in questions track by $index">
    {{questions[$index].title}}
    <input type="text" ng-model="questions[$index].value" ng-change="change()" /> {questions[$index].value}}
    <br />
</label>

查看更新后的Fiddle并注意第一个问题现在是&#39; 0&#39;。

答案 1 :(得分:1)

嘿,这是一个非常简单的问题。

这是因为ng-model="question.default"有价值: - '第一个问题'

但控制器中的香蕉模型ng-model =“banana”没有价值。

此处为您更新fiddle