角不更新循环,由于执行$ mdDialog(材料设计) [英] Angular does not updated loop due to implementation $mdDialog (Material Design)

查看:566
本文介绍了角不更新循环,由于执行$ mdDialog(材料设计)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据我的previous后

角循环没有更新,我更新了code稍微对话框添加到该按钮AA用户。

在我的app.js文件中唯一的变化是增加一个$ mdDialog框中的指令。因此,完整的code为我的app.js文件是:

  VAR应用= angular.module('ADDUSER',['ngMaterial']);app.controller('AppCtrl',函数($范围,$ HTTP,$ mdDialog){
$ scope.userInfo = [];/ **功能添加细节在MySQL referecing PHP的用户** /
$ scope.save_user =功能(){
    $ http.post('db.php中?行动= ADD_USER',
        {
            USER_NAME:$ scope.user_name,
            USER_EMAIL':$ scope.user_email
        }
    )    .success(功能(数据,状态,头,配置){
        $ scope.userInfo.push(数据);
        $ scope.get_user(); //这将获取从数据库最新记录
        的console.log(用户已成功添加到数据库);
        的console.log(数据);
    })    .error(功能(数据,状态,头,配置){
        的console.log(无法将用户添加到数据库);
    });
}/ **函数来得到在mysql中引用PHP添加的用户信息** /
$ scope.get_user =功能(){
    $ http.get('db.php中?行动= GET_USER')。成功(功能(数据)
    {
        $ scope.userInfo =数据;
        的console.log(你是在显示用户信息succesfull);
        // $ scope.get_user(); //这将获取从数据库最新记录
    })
}/ **函数从列表中引用的PHP删除用户** /
$ scope.delete_user =功能(指数){
    $ http.post('db.php中?行动= DELETE_USER',
        {
            USER_INDEX:指数
        }
    )
    .success(功能(数据,状态,头,配置){
        $ scope.get_user(); //这将获取从数据库最新记录
        的console.log('缺失succesfull');
    })    .error(功能(数据,状态,头,配置){
       的console.log(你不是在删除用户succesfull);
    });
}$ scope.showPopUp =功能(EV){
    $ mdDialog.show({
      控制器:DialogController,
      templateUrl:popup.tmpl.html',
      父:angular.element(document.body的)
      targetEvent:EV,
    })
};功能DialogController($范围,$ mdDialog){
    $ scope.closeDialog =功能(){
      $ mdDialog.hide();
    }    $ scope.save_user =功能(){
        $ mdDialog.hide();
    }
}});

我不得不注释掉GET_USER功能如下code($ scope.get_user();),否则我不能preform删除但在另一方面循环没有更新。所以无论是我注释掉$ scope.get_user()在去GET_USER功能,然后我可以删除用户或我就不做评论了出来,当我添加一个新用户,但随后删除功能不起作用循环将更新。 ..

我的html code是:

 <机身NG控制器=AppCtrl>
  < D​​IV>
    < UL NG-的init =GET_USER()>
      <李NG重复=用户用户信息> {{user.user_name}}< A HREF =#NG-
      点击=DELETE_USER(user.id)> - >删除< / A>< /李>
    < / UL>
  < / DIV> < MD-button类=MD-主要MD-提出了NG点击=showPopUp($事件)灵活
 柔性MD =100>添加一个用户LT; / MD-按钮>
< /身体GT;

和code的对话框(popup.tmpl.html)如下:

 < MD-ARIA对话框标签=添加或邀请用户NG-应用=ADDUSER>
<形式NG控制器=AppCtrl>
      < MD-工具栏>
       < D​​IV CLASS =MD-工具栏工具>
         < H2>添加或邀请用户LT; / H>
         <跨度柔性>< / SPAN>
         < MD-button类=MD-图标按钮NG点击=closeDialog()>
              < MD-图标MD-SVG-SRC =图像/ ic_close_24px.svgARIA标签=关闭
              对话>< / MD-图标>
         < / MD-按钮>
       < / DIV>
      < / MD-工具栏>
      < MD-对话框的内容>
        < D​​IV>
          其中p DIV布局=布局SM =列>
            < MD-输入容器柔性=>
            <标签>输入一个名称和LT; /标签>
            <输入名称=USER_EMAILNG模型=USER_NAME>
            < / MD-输入容器>
        < / DIV>
        其中p DIV布局=布局SM =列>
          < MD-输入容器柔性=>
          <标签>输入电子邮件和LT; /标签>
          <输入名称=USER_NAMENG模型=USER_EMAIL>
          < / MD-输入容器>
       < / DIV>
      < / DIV>
     < / MD-表盘
     < D​​IV CLASS =MD-行动布局=行>
       < MD-NG按钮,点击=closeDialog()级=MD-小学>取消< / MD-
        按钮>
       < MD-NG按钮,点击=save_user()NAME =ADD_USER级=MD-
       主要>添加< / MD-按钮>
     < / DIV>
    < /表及GT;
   < / MD-对话框>


解决方案

检查我的代码片段。

\r
\r

VAR应用= angular.module('ADDUSER',['ngMaterial']) ;\r
\r
app.run(['$ templateCache',\r
  功能($ templateCache){\r
    $ templateCache.put('popup.tmpl.html','< MD-ARIA对话框标签=添加或邀请用户NG-应用=ADDUSER>'+\r
      '<形式NG控制器=AppCtrl>' +\r
      '< MD-工具栏>' +\r
      '< D​​IV CLASS =MD-工具栏工具>' +\r
      '< H2>添加或邀请用户LT; / H>' +\r
      '<跨度柔性>< / SPAN>' +\r
      '< MD-button类=MD-图标按钮NG点击=closeDialog()>' +\r
      '< MD-图标MD-SVG-SRC =图像/ ic_close_24px.svgARIA标签=关闭对话框>< / MD-图标>' +\r
      '< / MD-按钮>' +\r
      '< / DIV>' +\r
      '< / MD-工具栏>' +\r
      '< MD-对话框的内容和GT;' +\r
      '< D​​IV>' +\r
      '< D​​IV布局=布局SM =列>' +\r
      '< MD-输入容器柔性=>' +\r
      '<标签>输入一个名称和LT; /标签> +\r
      '<输入名称=USER_EMAILNG模型=USER_NAME>' +\r
      '< / MD-输入容器>' +\r
      '< / DIV>' +\r
\r
      '< D​​IV布局=布局SM =列>' +\r
      '< MD-输入容器柔性=>' +\r
      '<标签>输入电子邮件和LT; /标签> +\r
      '<输入名称=USER_NAMENG模型=USER_EMAIL>' +\r
      '< / MD-输入容器>' +\r
      '< / DIV>' +\r
      '< / DIV>' +\r
      '< / MD-对话框的内容和GT;' +\r
      '< D​​IV CLASS =MD-行动布局=行>' +\r
      '< MD-NG按钮,点击=closeDialog()级=MD-小学>' +\r
      取消+\r
      '< / MD-按钮>' +\r
      '< MD-NG按钮,点击=保存()NAME =ADD_USER级=MD-小学>' +\r
      添加+\r
      '< / MD-按钮>' +\r
      '< / DIV>' +\r
      '< /形式为GT;' +\r
      '< / MD-对话框>');\r
\r
\r
  }\r
]);\r
\r
app.factory('UsersService',['$ Q',\r
  功能($ Q){\r
\r
    变种服务= {};\r
    service.data = [{\r
      USER_NAME:堆栈溢出,\r
      ID:1\r
    }];\r
\r
    service.get =功能(){\r
      变种推迟= $ q.defer();\r
\r
      deferred.resolve(service.data);\r
      返回deferred.promise;\r
    }\r
\r
    service.save =功能(数据){\r
      变种推迟= $ q.defer();\r
      data.id = Math.floor((的Math.random()* 999)+ 111);\r
      service.data.push(数据);\r
      deferred.resolve();\r
      返回deferred.promise;\r
    }\r
    service.delete =功能(用户){\r
      变种推迟= $ q.defer();\r
      警报('删除用户'+ user.id);\r
      VAR指数= service.data.indexOf(用户);\r
      service.data.splice(指数,1);\r
      deferred.resolve();\r
      返回deferred.promise;\r
\r
    }\r
    退换货服务;\r
  }\r
]);\r
\r
app.controller('AppCtrl',函数($范围,$ HTTP,$ mdDialog,UsersService){\r
  $ scope.userInfo = [];\r
\r
\r
  功能getUsers(){\r
    UsersService.get()。然后(功能(数据){\r
      _this.userInfo =数据;\r
    });\r
  }\r
  getUsers();\r
\r
  this.showPopUp =功能(EV){\r
    $ mdDialog.show({\r
      控制器:DialogController,\r
      templateUrl:popup.tmpl.html',\r
      父:angular.element(document.body的)\r
      targetEvent:EV,\r
    })\r
  };\r
\r
\r
  this.delete_user =功能(用户){\r
    UsersService.delete(用户)。然后(函数(){\r
      getUsers();\r
\r
    });\r
  };\r
\r
  $ scope.save =功能(){\r
    VAR OBJ = {\r
      USER_NAME:$ scope.user_name,\r
      USER_EMAIL':$ scope.user_email\r
    };\r
    UsersService.save(OBJ)。然后(函数(){\r
      getUsers();\r
      $ mdDialog.hide();\r
    });\r
  }\r
\r
  功能DialogController($范围,$ mdDialog){\r
    $ scope.closeDialog =功能(){\r
      $ mdDialog.hide();\r
    }\r
\r
  }\r
\r
  VAR _this =这一点;\r
\r
});

\r

<!DOCTYPE HTML>\r
< HTML LANG =ENNG-应用=ADDUSER>\r
\r
< HEAD>\r
  <间的charset =UTF-8/>\r
  < META HTTP-EQUIV =X-UA-Compatible的内容=IE =边缘/>\r
  < META NAME =视口CONTENT =WIDTH =设备宽度,初始规模= 1/>\r
  <标题>测试1 - 添加用户LT; /标题>\r
  <链接rel =stylesheet属性HREF =htt​​p://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css/>\r
  <链接HREF =htt​​p://netdna.bootstrapcdn.com/font-awesome/2.0/css/font-awesome.css的rel =stylesheet属性/>\r
  <链接rel =stylesheet属性HREF =htt​​ps://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.css/>\r
  <链接rel =stylesheet属性HREF =htt​​ps://fonts.googleapis.com/css?family=RobotoDraft:300,400,500,700,400italic/>\r
  <! - HTML5垫片和Respond.js对IE8的支持HTML5元素和媒体查询 - >\r
  !< - 警告:如果你通过文件浏览页面Respond.js不起作用:// - >\r
  <! - [如果LT IE 9] GT;\r
      &所述; SCRIPT SRC =htt​​ps://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js>&下; /脚本>\r
      &所述; SCRIPT SRC =htt​​ps://oss.maxcdn.com/respond/1.4.2/respond.min.js>&下; /脚本>\r
    百分比抑制率ENDIF] - GT!;\r
< /头>\r
\r
<机身NG控制器=AppCtrl为_>\r
  < D​​IV>\r
    < UL>\r
      <李NG重复=用户_.userInfo> {{user.user_name}} [{{user.id}}]< A HREF =#NG-点击=_ DELETE_USER(用户)> - >删除< / A>\r
      < /李>\r
    < / UL>\r
  < / DIV>\r
  < MD-button类=MD-主要MD-提出了NG-点击=_ showPopUp($事件)。柔性=柔性MD =100>\r
    添加用户\r
  < / MD-按钮>\r
  <! - <按钮式=按钮ID =btnAddUser级=BTN BTN-主要>添加用户和LT; /按钮> - >\r
  &所述; SCRIPT SRC =htt​​ps://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js>&下; /脚本>\r
  &所述; SCRIPT SRC =htt​​p://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js>&下; /脚本>\r
  &所述; SCRIPT SRC =htt​​ps://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.min.js>&下; /脚本>\r
  &LT;脚本src=\"https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js\"></script>\r
  &所述; SCRIPT SRC =htt​​ps://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js&GT;&下; /脚本&GT;\r
  &LT;脚本src=\"https://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.js\"></script>\r
  &LT;脚本SRC =htt​​p://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.6.0.js类型=文/ JavaScript的&GT;&LT; / SCRIPT&GT;\r
  &LT;脚本SRC =JS / app.js&GT;&LT; / SCRIPT&GT;\r
&LT; /身体GT;

\r

\r
\r

Based on my previous post: Angular loop is not updating, i updated the code slightly to add a dialog box to the button a a user.

the only change in my app.js file is the directive to add a $mdDialog box. so the complete code for my app.js file is:

var app = angular.module('AddUser', ['ngMaterial']);

app.controller('AppCtrl', function($scope, $http, $mdDialog){
$scope.userInfo =  [];

/** function to add details for a user in mysql referecing php **/
$scope.save_user = function() {
    $http.post('db.php?action=add_user', 
        {
            'user_name'  : $scope.user_name, 
            'user_email' : $scope.user_email
        }
    )

    .success(function (data, status, headers, config) {
        $scope.userInfo.push(data);
        $scope.get_user(); //this will fetch latest record from DB
        console.log("The user has been added successfully to the DB");
        console.log(data);
    })

    .error(function(data, status, headers, config) {
        console.log("Failed to add the user to DB");
    });
}

/** function to get info of user added in mysql referencing php **/
$scope.get_user = function() {
    $http.get('db.php?action=get_user').success(function(data)
    { 
        $scope.userInfo = data;   
        console.log("You were succesfull in showing user info"); 
        //$scope.get_user(); //this will fetch latest record from DB
    })
}

/** function to delete a user from list referencing php **/
$scope.delete_user = function(index) {  
    $http.post('db.php?action=delete_user', 
        {
            'user_index' : index
        }
    )      
    .success(function (data, status, headers, config) {    
        $scope.get_user();//this will fetch latest record from DB
        console.log('Deletion was succesfull');
    })

    .error(function(data, status, headers, config) {
       console.log("You were NOT succesfull in deleting a user"); 
    });
}

$scope.showPopUp= function(ev) {
    $mdDialog.show({
      controller: DialogController,
      templateUrl: 'popup.tmpl.html',
      parent: angular.element(document.body),
      targetEvent: ev,
    })
};

function DialogController($scope, $mdDialog) {
    $scope.closeDialog = function() {
      $mdDialog.hide();
    }

    $scope.save_user = function() {
        $mdDialog.hide();
    }
}

});

i had to comment out the following code in the get_user function ($scope.get_user();) otherwise i could not preform a delete but then on the other hand the loop did not update. so either i comment out $scope.get_user() in de get_user function and then i can delete a user or i don't comment it out and the loop will update when i add a new user but then the delete function does not work ...

my html code is:

<body ng-controller="AppCtrl">
  <div>
    <ul ng-init="get_user()">
      <li ng-repeat="user in userInfo ">{{user.user_name}}<a href="#" ng- 
      click="delete_user(user.id)"> --> Delete</a></li>
    </ul>
  </div>

 <md-button class="md-primary md-raised" ng-click="showPopUp($event)" flex 
 flex-md="100">Add a user</md-button>
</body>

and the code for the dialog box (popup.tmpl.html) is the following:

<md-dialog aria-label="Add or invite a user" ng-app="AddUser">
<form ng-controller="AppCtrl">
      <md-toolbar>
       <div class="md-toolbar-tools">
         <h2>Add or invite a user</h2>
         <span flex></span>
         <md-button class="md-icon-button" ng-click="closeDialog()">
              <md-icon md-svg-src="images/ic_close_24px.svg" aria-label="Close 
              dialog"></md-icon>
         </md-button>
       </div>
      </md-toolbar>
      <md-dialog-content>
        <div>
          <div layout="" layout-sm="column">
            <md-input-container flex="">
            <label>Enter a name</label>
            <input name="user_email" ng-model="user_name">
            </md-input-container>
        </div>
        <div layout="" layout-sm="column">
          <md-input-container flex="">
          <label>Enter an e-mail</label>
          <input name="user_name" ng-model="user_email">
          </md-input-container>
       </div>
      </div>
     </md-dial
     <div class="md-actions" layout="row">
       <md-button ng-click="closeDialog()" class="md-primary">Cancel</md-     
        button>
       <md-button ng-click="save_user()" name="add_user" class="md-
       primary">Add</md-button>
     </div>
    </form>
   </md-dialog>

解决方案

Check my snippet.

var app = angular.module('AddUser', ['ngMaterial']);

app.run(['$templateCache',
  function($templateCache) {
    $templateCache.put('popup.tmpl.html', '<md-dialog aria-label="Add or invite a user" ng-app="AddUser">' +
      '<form ng-controller="AppCtrl">' +
      '<md-toolbar>' +
      '<div class="md-toolbar-tools">' +
      '<h2>Add or invite a user</h2>' +
      '<span flex></span>' +
      '<md-button class="md-icon-button" ng-click="closeDialog()">' +
      '<md-icon md-svg-src="images/ic_close_24px.svg" aria-label="Close dialog"></md-icon>' +
      '</md-button>' +
      '</div>' +
      '</md-toolbar>' +
      '<md-dialog-content>' +
      '<div>' +
      '<div layout="" layout-sm="column">' +
      '<md-input-container flex="">' +
      '<label>Enter a name</label>' +
      '<input name="user_email" ng-model="user_name">' +
      '</md-input-container>' +
      '</div>' +

      '<div layout="" layout-sm="column">' +
      '<md-input-container flex="">' +
      '<label>Enter an e-mail</label>' +
      '<input name="user_name" ng-model="user_email">' +
      '</md-input-container>' +
      '</div>' +
      ' </div>' +
      '</md-dialog-content>' +
      '<div class="md-actions" layout="row">' +
      '<md-button ng-click="closeDialog()" class="md-primary">' +
      'Cancel' +
      '</md-button>' +
      '<md-button ng-click="save()" name="add_user" class="md-primary">' +
      'Add' +
      '</md-button>' +
      '</div>' +
      '</form>' +
      '</md-dialog>');


  }
]);

app.factory('UsersService', ['$q',
  function($q) {

    var service = {};
    service.data = [{
      user_name: 'Stack Overflow',
      id: 1
    }];

    service.get = function() {
      var deferred = $q.defer();

      deferred.resolve(service.data);
      return deferred.promise;
    }

    service.save = function(data) {
      var deferred = $q.defer();
      data.id = Math.floor((Math.random() * 999) + 111);
      service.data.push(data);
      deferred.resolve();
      return deferred.promise;
    }
    service.delete = function(user) {
      var deferred = $q.defer();
      alert('deleting user ' + user.id);
      var index = service.data.indexOf(user);
      service.data.splice(index, 1);
      deferred.resolve();
      return deferred.promise;

    }
    return service;
  }
]);

app.controller('AppCtrl', function($scope, $http, $mdDialog, UsersService) {
  $scope.userInfo = [];


  function getUsers() {
    UsersService.get().then(function(data) {
      _this.userInfo = data;
    });
  }
  getUsers();

  this.showPopUp = function(ev) {
    $mdDialog.show({
      controller: DialogController,
      templateUrl: 'popup.tmpl.html',
      parent: angular.element(document.body),
      targetEvent: ev,
    })
  };


  this.delete_user = function(user) {
    UsersService.delete(user).then(function() {
      getUsers();

    });
  };

  $scope.save = function() {
    var obj = {
      'user_name': $scope.user_name,
      'user_email': $scope.user_email
    };
    UsersService.save(obj).then(function() {
      getUsers();
      $mdDialog.hide();
    });
  }

  function DialogController($scope, $mdDialog) {
    $scope.closeDialog = function() {
      $mdDialog.hide();
    }

  }

  var _this = this;

});

<!DOCTYPE html>
<html lang="en" ng-app="AddUser">

<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Test 1 - Add user</title>
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" />
  <link href="http://netdna.bootstrapcdn.com/font-awesome/2.0/css/font-awesome.css" rel="stylesheet" />
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=RobotoDraft:300,400,500,700,400italic" />
  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body ng-controller="AppCtrl as _">
  <div>
    <ul>
      <li ng-repeat="user in _.userInfo ">{{user.user_name}} [{{user.id}}]<a href="#" ng-click="_.delete_user(user)"> --> Delete</a>
      </li>
    </ul>
  </div>
  <md-button class="md-primary md-raised" ng-click="_.showPopUp($event)" flex="" flex-md="100">
    Add a user
  </md-button>
  <!-- <button type="button" id="btnAddUser" class="btn btn-primary">Add User</button> -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.js"></script>
  <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.6.0.js" type="text/javascript"></script>
  <script src="js/app.js"></script>
</body>

这篇关于角不更新循环,由于执行$ mdDialog(材料设计)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆