【问题标题】:Adding parameter to ng-click function inside ng-repeat doesn't seem to work在 ng-repeat 中向 ng-click 函数添加参数似乎不起作用
【发布时间】:2013-06-07 01:20:30
【问题描述】:

我有一个带有ng-repeat 的简单循环,如下所示:

<li ng-repeat='task in tasks'>
  <p> {{task.name}}
  <button ng-click="removeTask({{task.id}})">remove</button>
</li>

控制器$scope.removeTask(taskID)中有一个函数。

据我所知,Angular 将首先渲染视图并将插入的 {{task.id}} 替换为数字,然后在单击事件时评估 ng-click 字符串。

在这种情况下,ng-click 完全符合预期,即:ng-click="removeTask(5)". 但是......它什么也没做。

当然,我可以编写代码从 $tasks 数组甚至 DOM 中获取 task.id,但这似乎不像 Angular 的方式。

那么,如何在ng-repeat 循环内向ng-click 指令添加动态内容?

【问题讨论】:

    标签: angularjs ng-repeat angularjs-ng-click


    【解决方案1】:

    代替

    <button ng-click="removeTask({{task.id}})">remove</button>
    

    这样做:

    <button ng-click="removeTask(task.id)">remove</button>
    

    请看这个小提琴:

    http://jsfiddle.net/JSWorld/Hp4W7/34/

    【讨论】:

    • +1:如果您的 ng-click 表达式不使用方括号,这也适用,即 ng-click="taskData.currentTaskId = task.id"
    • 谢谢先生..我看了很多博客,但我的问题已经被您的解决方案解决了。
    【解决方案2】:

    真正让我着迷的一件事是,当我在浏览器中检查这个 html 时,并没有看到它扩展为以下内容:

    <button ng-click="removeTask(1234)">remove</button>
    

    我看到了:

    <button ng-click="removeTask(task.id)">remove</button>
    

    但是,后者有效!

    这是因为您在“Angular World”中,当您在 ng-click="" 中时,Angular 已经准备好知道 task.id,因为您在它的模型中。不需要像 {{}} 那样使用数据绑定。

    此外,如果你想传递任务对象本身,你可以喜欢:

    <button ng-click="removeTask(task)">remove</button>
    

    【讨论】:

    • 如果您的方法正在查找字符串,这将如何工作?
    • @Dinerdo 不会。要执行“removeTask(task)”,您必须更改方法以期望获取任务对象并从该对象获取 id 属性。
    【解决方案3】:

    同样值得注意的是,对于在搜索中找到此内容的人来说,这是...

    <div ng-repeat="button in buttons" class="bb-button" ng-click="goTo(button.path)">
      <div class="bb-button-label">{{ button.label }}</div>
      <div class="bb-button-description">{{ button.description }}</div>
    </div>
    

    注意ng-click 的值。传递给goTo() 的参数是来自绑定对象(button)属性的字符串,但它没有用引号括起来。看起来 AngularJS 为我们处理了这些。我被挂断了几分钟。

    【讨论】:

      【解决方案4】:

      这行得通。谢谢。我正在注入自定义 html 并在控制器中使用 angular 编译它。

              var tableContent= '<div>Search: <input ng-model="searchText"></div>' 
                                  +'<div class="table-heading">'
                                  +    '<div class="table-col">Customer ID</div>'
                                 + ' <div class="table-col" ng-click="vm.openDialog(c.CustomerId)">{{c.CustomerId}}</div>';
      
                  $timeout(function () {
                  var linkingFunction = $compile(tableContent);
                  var elem = linkingFunction($scope);
      
                  // You can then use the DOM element like normal.
                  jQuery(tablePanel).append(elem);
      
                  console.log("timeout");
              },100);
      

      【讨论】:

        【解决方案5】:

        以上答案非常好。您可以查看以下完整代码示例,以便您确切知道如何使用

          	var app = angular.module('hyperCrudApp', []);
        
          	app.controller('usersCtrl', function($scope, $http) {
          	  $http.get("https://jsonplaceholder.typicode.com/users").then(function (response) {
          	  	  console.log(response.data)
        
          	      $scope.users = response.data;
                  $scope.setKey = function (userId){
                      alert(userId)
                      if(localStorage){
                        localStorage.setItem("userId", userId)
                      } else {
                        alert("No support of localStorage")
                        return
                      }
                  }//function closed  
          	  });
          	});
            		#header{
            			color: green;
            			font-weight: bold;
            		}
          <!DOCTYPE html>
          <html>
          <head>
            <title>HyperCrud</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
          </head>
          <body>
           	<!-- NAVBAR STARTS -->
              <nav class="navbar navbar-default navbar-fixed-top">
                <div class="container">
                  <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                      <span class="sr-only">Toggle navigation</span>
                      <span class="icon-bar"></span>
                      <span class="icon-bar"></span>
                      <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#">HyperCrud</a>
                  </div>
                  <div id="navbar" class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                      <li class="active"><a href="/">Home</a></li>
                      <li><a href="/about/">About</a></li>
                      <li><a href="/contact/">Contact</a></li>
                      <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Apps<span class="caret"></span></a>
                        <ul class="dropdown-menu">
                          <li><a href="/qAlarm/details/">qAlarm &raquo;</a></li>
                          <li><a href="/YtEdit/details/">YtEdit &raquo;</a></li>
                          <li><a href="/GWeather/details/">GWeather &raquo;</a></li>
                          <li role="separator" class="divider"></li>
                          <li><a href="/WadStore/details/">WadStore &raquo;</a></li>
                          <li><a href="/chatsAll/details/">chatsAll</a></li>
                        </ul>
                      </li>
                    </ul>
                    <ul class="nav navbar-nav navbar-right">
                      <li><a href="/login/">Login</a></li>
                      <li><a href="/register/">Register</a></li>
                      <li><a href="/services/">Services<span class="sr-only">(current)</span></a></li>
                    </ul>
                  </div>
                </div>
              </nav>
              <!--NAVBAR ENDS-->
          <br>
          <br>
        
          <div ng-app="hyperCrudApp" ng-controller="usersCtrl" class="container">
          		<div class="row">
          			<div class="col-sm-12 col-md-12">
          				<center>
          						<h1 id="header"> Users </h1>
          				</center>
          			</div>
          		</div>
        
          		<div class="row" >
                <!--ITERATING USERS LIST-->
          		  <div class="col-sm-6 col-md-4" ng-repeat="user in users">
          		    <div class="thumbnail">
          		      <center>
          		      	<img src="https://cdn2.iconfinder.com/data/icons/users-2/512/User_1-512.png" alt="Image - {{user.name}}" class="img-responsive img-circle" style="width: 100px">
          		      	<hr>
          		      </center>
          		      <div class="caption">
          		      	<center>
          			        <h3>{{user.name}}</h3>
          			        <p>{{user.email}}</p>
          			        <p>+91 {{user.phone}}</p>
          			        <p>{{user.address.city}}</p>
          			       </center>
          		      </div>
                    <div class="caption">
                        <a href="/users/delete/{{user.id}}/" role="button" class="btn btn-danger btn-block" ng-click="setKey(user.id)">DELETE</a>
                        <a href="/users/update/{{user.id}}/" role="button" class="btn btn-success btn-block" ng-click="setKey(user.id)">UPDATE</a>
                    </div>
          		    </div>
          		  </div>
        
                <div class="col-sm-6 col-md-4">
                  <div class="thumbnail">
                    <a href="/regiser/">
                     <img src="http://img.bhs4.com/b7/b/b7b76402439268b532e3429b3f1d1db0b28651d5_large.jpg" alt="Register Image" class="img-responsive img-circle" style="width: 100%">
                    </a>
                  </div>
                </div>
          		</div>
              <!--ROW ENDS-->
          </div>
        
        
          </body>
          </html>

        【讨论】:

          【解决方案6】:

          HTML:

          <div  ng-repeat="scannedDevice in ScanResult">
                  <!--GridStarts-->
                    <div >
                        <img ng-src={{'./assets/img/PlaceHolder/Test.png'}} 
                             <!--Pass Param-->
                             ng-click="connectDevice(scannedDevice.id)"
                             altSrc="{{'./assets/img/PlaceHolder/user_place_holder.png'}}" 
                             onerror="this.src = $(this).attr('altSrc')">
                     </div>    
           </div>
          

          Java 脚本:

             //Global Variables
              var  ANGULAR_APP = angular.module('TestApp',[]);
          
              ANGULAR_APP .controller('TestCtrl',['$scope', function($scope) {
          
                //Variables
                $scope.ScanResult = [];
          
                //Pass Parameter
                $scope.connectDevice = function(deviceID) {
                      alert("Connecting : "+deviceID );
                  };
               }]);
          

          【讨论】:

            【解决方案7】:

            这里是带有 ng click 功能的 ng 重复并用滑块追加

            <script>
            var app = angular.module('MyApp', [])
                    app.controller('MyController', function ($scope) {
                    $scope.employees = [
                        { 'id': '001', 'name': 'Alpha', 'joinDate': '05/17/2015', 'age': 37 },
                        { 'id': '002', 'name': 'Bravo', 'joinDate': '03/25/2016', 'age': 27 },
                        { 'id': '003', 'name': 'Charlie', 'joinDate': '09/11/2015', 'age': 29 },
                        { 'id': '004', 'name': 'Delta', 'joinDate': '09/11/2015', 'age': 19 },
                        { 'id': '005', 'name': 'Echo', 'joinDate': '03/09/2014', 'age': 32 }
                    ]
            
                        //This will hide the DIV by default.
                            $scope.IsVisible = false;
                        $scope.ShowHide = function () {
                            //If DIV is visible it will be hidden and vice versa.
                            $scope.IsVisible = $scope.IsVisible ? false : true;
                        }
                    });
            </script>
            </head>
            
            <body>
            
            <div class="container" ng-app="MyApp" ng-controller="MyController">
            <input type="checkbox" value="checkbox1" ng-click="ShowHide()" /> checkbox1
            <div id="mixedSlider">
                                <div class="MS-content">
                                    <div class="item"  ng-repeat="emps in employees"  ng-show = "IsVisible">
                                      <div class="subitem">
                    <p>{{emps.id}}</p>
                    <p>{{emps.name}}</p>
                    <p>{{emps.age}}</p>
                    </div>
                                    </div>
            
            
                                </div>
                                <div class="MS-controls">
                                    <button class="MS-left"><i class="fa fa-angle-left" aria-hidden="true"></i></button>
                                    <button class="MS-right"><i class="fa fa-angle-right" aria-hidden="true"></i></button>
                                </div>
                            </div>
            </div>
            <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> 
            <script src="js/multislider.js"></script> 
            <script>
            
                    $('#mixedSlider').multislider({
                        duration: 750,
                        interval: false
                    });
            </script>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多