【问题标题】:ng-model not working when value set using jQuery使用 jQuery 设置值时 ng-model 不起作用
【发布时间】:2016-04-04 10:08:26
【问题描述】:

我有一个带有一些表单控件的引导弹出对话框。每个控件都使用 ng-model 绑定。对于对话框中的两个文本框,我在对话框打开时使用 jquery 设置值,其余两个是用户可编辑的。用户可对其进行编辑的两个 ng-model 工作正常。但对其他人来说不是。如果我自己更改值,它们将正常工作。但不是在使用 jQuery 设置值时。我必须使用 jquery 设置值。从这几天开始挣扎。 任何帮助将不胜感激。 这是我的代码

<body ng-app="my-app" ng-controller="Ctrl">
<div class="container">

  <h3>Modal Example</h3>

  <!-- Button to trigger modal -->
  <div>
    <a href="#contactUser" role="button" class="btn" data-toggle="modal">Launch Modal</a>
  </div>

  <!-- Modal -->


  <div id="contactUser" class="modal fade openDilog" role="dialog">
    <div id="emailform" class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title"><span class="glyphicon glyphicon-envelope"></span>Contact User</h4>
        </div>
        <div class="modal-body ">
          <div class="form-group row">
            <label class="control-label col-sm-2" for="subject">Email:</label>
            <div class="col-sm-10">
              <input type="email" ng-model="email" class="form-control" id="email" placeholder="Enter Subject" />
            </div>
          </div>
          <div class="form-group row">
            <label class="control-label col-sm-2" for="username">UserName:</label>
            <div class="col-sm-10">
              <input type="text" class="form-control" ng-model="username" id="username" name="username" placeholder="Enter UserName" />
            </div>
          </div>
          <div class="form-group row">
            <label class="control-label col-sm-2" for="subject">Subject:</label>
            <div class="col-sm-10">
              <input type="text" class="form-control" required ng-model="subject" id="subject" placeholder="Enter Subject" />
            </div>
          </div>
          <div class="form-group row">
            <label class="control-label col-sm-2" for="message">Message:</label>
            <div class="col-sm-10">
              <textarea rows="5" class="form-control" required ng-model="message" id="message" placeholder="Message Goes Here"></textarea>
            </div>
          </div>
          <div class="form-group row">
            <div class="col-sm-offset-2 col-sm-6">
              <button type="submit" ng-click="Contact()" class="btn btn-primary">Submit</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  </div>
  </body>

Javascript

$('.openDilog').on('show.bs.modal', function (e) {
    $(e.currentTarget).find('input[type="email"]').val('email@gmail.com');
    $(e.currentTarget).find('input[name="username"]').val('username');
});

var app = angular.module('my-app', []);

    app.controller('Ctrl', function($scope){

         $scope.Contact = function() {
      console.log($scope.email);
      console.log($scope.subject);
      console.log($scope.message);
      console.log($scope.username);
    }
    });

这是我为这个问题创建的小提琴

Fiddle

【问题讨论】:

  • 为什么不直接在 $scope 中分配用户名,电子邮件而不是输入?
  • 实际上我有一个用户表,当单击特定用户的按钮时,此对话框打开。这些值对应于所选用户。如果是针对单个用户,我会那样做。
  • 创建一个用户数组并使用 ng-repeat 代替?根本没有理由使用 Jquery。在 angular.js 中避免使用 JQuery 是一种好习惯。

标签: javascript jquery angularjs twitter-bootstrap dialog


【解决方案1】:

Working Plnkr

您可以通过从外部控制器访问scope 来做到这一点。

HTML: 只需在HTML 中添加id 属性即可。例如-> id='outer'

<body ng-app="my-app" ng-controller="Ctrl" id='outer'>

JavaScript:

$('.openDilog').on('show.bs.modal', function (e) {
        var scope = angular.element($("#outer")).scope();
    scope.$apply(function(){
        scope.email = 'email@gmail.com';
        scope.username = 'username';
    });

});

希望能解决您的问题。

【讨论】:

    【解决方案2】:

    你能在角度范围内初始化值吗?

    var app = angular.module('my-app', []);
    
        app.controller('Ctrl', function($scope){
    
    $scope.listUser = [
    {email: "test1@test.com", username:"test1"},
    {email: "test2@test.com", username:"test2"},
    {email: "test3@test.com", username:"test3"},
    {email: "test4@test.com", username:"test4"}
    ];
             $scope.Contact = function() {
          console.log($scope.email);
          console.log($scope.subject);
          console.log($scope.message);
          console.log($scope.username);
        }
    
        $scope.openPopin = function(username, email) {
          $scope.email = email;
          $scope.username = username;
        }
        });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-rc.1/angular.min.js"></script>
    <script>
    
    </script>
    <body ng-app="my-app" ng-controller="Ctrl">
    <div class="container">
    
      <h3>Modal Example</h3>
    
      <!-- Button to trigger modal -->
      <div>
        <a href="#contactUser" ng-repeat="user in listUser" role="button" class="btn" data-toggle="modal" ng-click="openPopin(user.username, user.email)">Launch Modal</a>
      </div>
    
      <!-- Modal -->
    
    
      <div id="contactUser" class="modal fade openDilog" role="dialog">
        <div id="emailform" class="modal-dialog">
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal">&times;</button>
              <h4 class="modal-title"><span class="glyphicon glyphicon-envelope"></span>Contact User</h4>
            </div>
            <div class="modal-body ">
              <div class="form-group row">
                <label class="control-label col-sm-2" for="subject">Email:</label>
                <div class="col-sm-10">
                  <input type="email" ng-model="email" class="form-control" id="email" placeholder="Enter Subject" />
                </div>
              </div>
              <div class="form-group row">
                <label class="control-label col-sm-2" for="username">UserName:</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" ng-model="username" id="username" name="username" placeholder="Enter UserName" />
                </div>
              </div>
              <div class="form-group row">
                <label class="control-label col-sm-2" for="subject">Subject:</label>
                <div class="col-sm-10">
                  <input type="text" class="form-control" required ng-model="subject" id="subject" placeholder="Enter Subject" />
                </div>
              </div>
              <div class="form-group row">
                <label class="control-label col-sm-2" for="message">Message:</label>
                <div class="col-sm-10">
                  <textarea rows="5" class="form-control" required ng-model="message" id="message" placeholder="Message Goes Here"></textarea>
                </div>
              </div>
              <div class="form-group row">
                <div class="col-sm-offset-2 col-sm-6">
                  <button type="submit" ng-click="Contact()" class="btn btn-primary">Submit</button>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      </div>
      </body>

    this is my fiddle with ng-repeat

    【讨论】:

    • 实际上我不能这样做,因为这些值将基于从表中选择的行来
    • 你能举个例子吗?
    • 我有一个从数据库中获取的列表。并使用 ng-repeat 显示为表格,因此当单击与特定行对应的按钮时,该行的值应该出现在控件中。
    • 我用 ng-repeat 改变了我的例子
    【解决方案3】:

    您可以使用 ui.bootstrap 模块来完成您尝试为您做的所有艰苦工作

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2018-09-09
      • 1970-01-01
      • 2015-12-22
      相关资源
      最近更新 更多