2015-09-17 2 views
7

У меня есть угловое приложение, которое использует директивы. В директиве у меня есть шаблон, который определяет всплывающее модальное.AngularJs не обновляет модель при изменении входных данных

В принципе, это очень простое приложение, которое показывает список авторов книги, и в списке есть кнопка Edit, которая открывает модальное окно. Если я открою модальный для редактирования автора книги и просто закрою его, не редактируя автора - проблем нет.

Но если я открою модальный и напечатаю что-то на входе автора и закрою его, модель застрянет с текущим значением ввода за все время, поэтому, если я открою другого автора для редактирования, модель не будет обновляться.

Мой вопрос: почему это происходит, и как его исправить?

HTML

<div ng-controller="MyCtrl"> 
    <table class="table table-hover"> 
      <tr>    
       <td><b>Publisher</b></td>     
       <td><b>Edit Publisher</b></td> 
      </tr> 
      <tr ng-repeat="book in books"> 
       <td> 
        {{book.Author}} 
       </td> 
       <td> 
        <span ng-click="toggleModal(book)" class="btn btn-primary">Edit</span> 
       </td> 
      </tr> 
     </table> 

    <modal-dialog info='modalShown' show='modalShown' width='600px' height='60%'> 
     <div ng-show="divBook"> 
       <input type="text" name="bookAuthor" ng-model="bookAuthor" /> 
     </div> 
    </modal-dialog> 
</div> 

Угловой

var myApp = angular.module('myApp',[]); 

myApp.controller("MyCtrl", function($scope){ 
    $scope.books = [{Author:"Jon Skeet"},{Author:"John Papa"},{Author:"Scott Hanselman"}]; 

    $scope.modalShown = false; 
    $scope.toggleModal = function (book) { 
      $scope.bookAuthor = book.Author; 
      $scope.modalShown = !$scope.modalShown; 
      $scope.divBook = true; 
    };  
}); 

myApp.directive('modalDialog', function() { 
    return { 
     restrict: 'E', 
     template: "<div class='ng-modal' ng-show='show'>" 
        +"<div class='ng-modal-overlay' ng-click='hideModal()'>" 
        +"</div>" 
         +"<div class='ng-modal-dialog' ng-style='dialogStyle'>" 
         +"<div class='ng-modal-close' ng-click='hideModal()'>X</div>" 
         +"<div class='ng-modal-dialog-content' ng-transclude>" 
        +"</div>" 
        +"</div>" 
       +"div>", 
     replace: true, 
     scope: { 
      show: '=info' 
     }, 
     transclude: true, 
     link: function (scope, element, attrs) { 

      //scope.apply(); 
      scope.dialogStyle = {}; 
      if (attrs.width) 
       scope.dialogStyle.width = attrs.width; 
      if (attrs.height) 
       scope.dialogStyle.height = attrs.height; 
      scope.hideModal = function() { 
       scope.show = false; 
      }; 
     } 
    }; 
}); 

Таким образом, тест будет:

Нажмите Edit -> изменить значение -> закрыть модальный

Нажмите Изменить на другого автора.

JSFiddle:http://jsfiddle.net/HB7LU/17694/

ответ

0

Значение модель меняется, однако, вы создаете новую переменную и не модифицируя исходный элемент массива.

Вы можете изменить это, поставив указатель массива объектов в области видимости переменной

$scope.toggleModal = function (book) { 
     $scope.book = book; 
     $scope.modalShown = !$scope.modalShown; 
     $scope.divBook = true; 
}; 

а затем указывает на нг-модели к свойству .Author объекта.

<input type="text" name="bookAuthor" ng-model="book.Author" /> 

См модифицирована JSFiddle: http://jsfiddle.net/9a2jcc9u/1/

0

Я изменил свой JS скрипку, если вы хотите изменить имя, и он автоматически изменяется в сетке, чем удалить angular.copy (книга) и непосредственно назначать книгу. Вы можете увидеть свой jsfiddle здесь jsfiddle

myApp.controller("MyCtrl", function($scope){ 
    $scope.books = [{Author:"Jon Skeet"},{Author:"John Papa"},{Author:"Scott Hanselman"}]; 

    $scope.modalShown = false; 
    $scope.toggleModal = function (book) { 
      $scope.book = angular.copy(book); 
      $scope.modalShown = !$scope.modalShown; 
      $scope.divBook = true; 
    };  
}); 

ваш модальным

<modal-dialog info='modalShown' show='modalShown' width='600px' height='60%'> 
    <div ng-show="divBook"> 
      <input type="text" name="bookAuthor" ng-model="book.Author" /> 
    </div> 
</modal-dialog> 
0

попробовать что-то вроде этого

myApp.controller('MyCtrl', ['$scope',function($scope) { 

//your code 

}]); 
Смежные вопросы