【问题标题】:AngularJS - Directive ngModel doesn't get updatedAngularJS - 指令 ngModel 没有得到更新
【发布时间】:2023-03-11 01:27:01
【问题描述】:

我对 AngularJS 指令有很好的理解,但我认为我的指令在这里遗漏了一些东西。

出了什么问题:在初始页面加载时,ngModel 被正确触发,我成功接收到数据并在输入中建模。

我之后所做的一切……都行不通。如果我修改输入中的文本,模型不会更新。

请注意,如果我不使用指令(直接 HTML),它可以正常工作。


我有这样的指令:

.directive('defaultFormGroup', function () {
    return {
        restrict: 'A',
        templateUrl: 'form-group.html',
        replace: true,
        scope: {
            uniqueId: '@',
            labelTitle: '@',
            placeholderText: '@',
            ngModel: '=',
            bsLabelClasses: '@',
            bsFormControlClasses: '@'
        }
    };
})


指令的模板:

<div class="form-group">

    <label class="{{bsLabelClasses}} control-label text-left" for="{{uniqueId}}">{{labelTitle}}</label>

    <div class="{{bsFormControlClasses}}">
        <input type="text" class="form-control" id="{{uniqueId}}" placeholder="{{placeholderText}}" data-ng-model="ngModel">
    </div>

</div>


这是我在模板中调用指令的方式:

<div data-default-form-group 
     data-label-title="Name" 
     data-placeholder-text="Name" 
     data-unique-id="name" 
     data-bs-label-classes="col-sm-2 col-md-2" 
     data-bs-form-control-classes="col-sm-3 col-md-3" 
     data-ng-model="site.name">
</div>


单选按钮也有同样的问题:

.directive('radioSwitch', function () {
    return {
        restrict: 'A',
        templateUrl: 'radio-switch.html',
        replace: true,
        scope: {
            ngModel: '=',
            radioName: '@',
            firstId: '@',
            firstValue: '@',
            firstLabel: '@',
            secondId: '@',
            secondValue: '@',
            secondLabel: '@',
        }
    };
})


模板:

<input type="radio" name="{{radioName}}" value="{{firstValue}}" id="{{firstId}}" data-ng-model="ngModel">
<label for="{{firstID}}">{{firstLabel}}</label>

<input type="radio" name="{{radioName}}" value="{{secondValue}}" id="{{secondId}}" data-ng-model="ngModel">
<label for="{{secondID}}">{{secondLabel}}</label>


HTML:

<div data-radio-switch 
     data-ng-model="site.existingCustomer" 
     data-first-label="Yes" 
     data-second-label="No" 
     data-radio-name="existingCustomer" 
     data-first-value="True" 
     data-first-id="true" 
     data-second-value="False" 
     data-second-id="false">
</div>


我错过了什么?

更新 我的指令中遗漏了一些东西...我想选择输入类型(文本、电子邮件、密码等...)

如果是文本区域,则 HTML 是不同的...但似乎这条线不起作用data-ng-if=" inputType !== textarea "&gt; ...如果我删除它,它会起作用

有人知道为什么吗?

这是一个笨蛋:http://plnkr.co/edit/ITElF2epihSALeTutQAz

【问题讨论】:

标签: angularjs angularjs-directive angular-ngmodel


【解决方案1】:

指令本身似乎没有什么问题:看下面的例子和你的指令,你可以看到 model 是指令的 ng-model 属性得到更新。因此,请尝试重现您的问题,以便我们为您提供帮助(嵌入式 sn-p 或 jsfiddle,或只是更多代码)

angular.module('test', [])

.controller('ctrl', function($scope) {
  $scope.model = 'foo';
})

.directive('defaultFormGroup', function () {
    return {
        restrict: 'A',
        template: '<div class="form-group"> <label class="{{bsLabelClasses}} control-label text-left" for="{{uniqueId}}">{{labelTitle}}</label> <div class="{{bsFormControlClasses}}"> <input type="text" class="form-control" id="{{uniqueId}}" placeholder="{{placeholderText}}" data-ng-model="ngModel"> </div> </div>',
        replace: true,
        scope: {
            uniqueId: '@',
            labelTitle: '@',
            placeholderText: '@',
            ngModel: '=',
            bsLabelClasses: '@',
            bsFormControlClasses: '@'
        }
    };
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="test" ng-controller="ctrl">
  <div>model: {{model}}</div>
  <div default-form-group ng-model="model"></div>
</div>

更新:问题似乎来自 ng-if,如下面的 sn-p 中所重现。它是通过使用 nh-show 来修复的,因为 ng-if 可能会从您的指令中松开绑定。不过具体原因我不清楚。

angular.module('test', [])

.controller('ctrl', function($scope) {
  $scope.model = 'foo';
})

.directive('defaultFormGroup', function () {
    return {
        restrict: 'A',
        template: '<div ng-if="true"><input type="text" data-ng-model="ngModel" /></div>',
        replace: true,
        scope: {
            ngModel: '='
        }
    };
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="test" ng-controller="ctrl">
  <div>model: {{model}}</div>
  <div default-form-group ng-model="model"></div>
</div>

【讨论】:

  • 这确实有效......但它不使用模板Url。我尝试使用这种方法,如果我将模板直接放在 html 中,它就可以工作,这不是我想做的事情......
  • 我使用 templateUrl 添加了一个 Plunker,看来我的 ng-if 没有按预期工作
  • 哦,这样更好。问题是您的模板中的 ng-if 。没有它它确实有效。我没有时间真正理解为什么,但这是一个有趣的问题。现在我想你可以使用 ng-show
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2015-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多