zoukankan      html  css  js  c++  java
  • [Angularjs]ng-repeat中使用ng-model遇到的问题

    写在前面

    在ng-reapet中如何为ng-model双向绑定呢?在项目中确实遇到这样的问题,绑定了,但是在controller中获取不到它的值,确实挺奇怪的。

    系列文章

    [Angularjs]ng-select和ng-options

    [Angularjs]ng-show和ng-hide

    [Angularjs]视图和路由(一)

    [Angularjs]视图和路由(二)

    [Angularjs]视图和路由(三)

    [Angularjs]视图和路由(四)

    [Angularjs]ng-class,ng-class-even,ng-class-odd

    [Angularjs]单页应用之分页

    [Angularjs]国际化

    一个例子

    有这样一个人员列表,我们希望单击按钮对某人的姓名进行修改,这个时候我们就需要获取当前对象的某个属性,代码片段及视图如下所示:

    <!DOCTYPE html>
    <html ng-app="app">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>ng-repeat和ng-model</title>
        <meta charset="utf-8" />
        <script src="JS/angular.min.js"></script>
        <script>
            var app = angular.module('app', []);
            app.controller('DetailsController', function ($scope) {
    
                $scope.pepoles = [{ 'id': 1, 'name': 'zhangsan', 'gender': '' }, { 'id': 2, 'name': 'zhangsan2', 'gender': '' }, { 'id': 3, 'name': 'zhangsan3', 'gender': '' }];
                console.log($scope.pepoles);
    
            });
    
        </script>
    </head>
    <body>
    
        <div ng-controller="DetailsController">
    
            <ul>
                <li ng-repeat=" p in pepoles">
                    ID:{{p.id}}<br />
                    name:{{p.name}}<br />
                    gender:{{p.gender}}<br />
                    <input type="text" name="name" value="{{p.name}}" ng-model="p.name" />  <button>更改</button>
                </li>
            </ul>
    
        </div>
    </body>
    </html>

    一般会这样写为按钮注册单击事件,单击后得到文本框绑定的属性的新值:

    <button ng-click="changeName()">更改</button>

    并在Controller中编写方法的实现,以及$http请求服务进行修改数据库。

                $scope.changeName = function () {
                    console.log($scope.name);
                };

    这样单击按钮后

    并不能识别name属性。

    但是可以通过另外的方法实现

                    <input type="text" name="name" value="{{p.name}}" ng-model="p.name" />
                    <button ng-click="changeName(p)">更改</button>
                $scope.changeName = function (item) {
                    console.log(item);
                };

    解决办法:直接将当前对象传到方法中或者传属性p.name。

    网上还有另外一种解决方案,但是有个问题。

     <input type="text" name="name" value="{{p.name}}" ng-model="$parent.name" />

    这种方式在controller中确实可以通过$scope.name拿到文本框的值,但是在视图中,修改一个其他的也会跟着改变。

    最后就出现了这样的情况:

    很明显这并不是我们想要的结果。

    总结

    在ng-repeat中ng-model的问题,原因是ng-model对controller中的$scope是不可见的,所以在使用repeat中的某个对象的属性的时候,最好还是将该对象或者该对象的值传到方法中。刚接触angularjs,不知道有没有更好的解决办法,这是在项目中遇到的一个问题,记录在此,希望你有个更好的解决方式,不妨留言,谢谢。

  • 相关阅读:
    js(5)关于this的指代值
    bootstrap(2)关于表单
    bootstrap(1)关于排版
    bootstrap基础(0)写在前面的一些话
    js(4) 继承
    js(3)面向对象的程序设计
    js(2)关于作用域和作用域链
    鼠标事件(jQuery方法)
    鼠标事件(JS原生方法)
    键盘事件(在输入框中输入内容后按回车键)
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/4749854.html
Copyright © 2011-2022 走看看