首页 文章

将参数添加到ng-repeat内的ng-click功能似乎不起作用

提问于
浏览
373

我有一个像_1312782这样的简单循环:

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

控制器 $scope.removeTask(taskID) 中有一个功能 .

据我所知,Angular将首先渲染视图并用数字替换插值的 {{task.id}} ,然后,在click事件中,将评估 ng-click string .

在这种情况下 ng-click 完全得到预期的结果,即: ng-click="removeTask(5)". 然而......它没有做任何事情 .

当然我可以编写一个代码来从 $tasks 数组甚至DOM中获取 task.id ,但这看起来不像Angular方式 .

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

7 回答

  • 3

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

    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>
    
  • 715

    代替

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

    做这个:

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

    请看这个小提琴:

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

  • 0

    真正让我感到困惑的一件事是,当我在浏览器中检查这个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>
    
  • 8

    另外值得注意的是,对于在搜索中发现这一点的人来说,这是......

    <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为我们处理 . 我挂了几分钟 .

  • 49

    这很有效 . 谢谢 . 我正在注入自定义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);
    
  • 0

    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 );
            };
         }]);
    
  • 0

    这是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>
    

相关问题