2015-10-12 5 views
0

Почему три пропущенных строки не работают? Несмотря на то, что они сбросят поля ввода до нуля, вывод также полностью пуст. только переназначая объект, он работает правильно. (оставляя мой заводский файл для Users.create для краткости, он выполняет http get)Сброс Угловой ввод путем создания нового объекта и переназначения свойств

Кажется, что в обоих случаях «bro» записывается до «эй», я предполагаю, что 3 строки переназначают $ scope. newUser, прежде чем он войдет в User.create, но не будет ли $ scope.newUser = {} делать это?

$scope.addUser = function(){ 
    Users.create($scope.newUser).then(function() { 
     // console.log('hey'); 
     $scope.displayUsers(); 
    }) 

    $scope.newUser = {}; 
    console.log('bro'); 
    // $scope.newUser.name = ''; 
    // $scope.newUser.email = ''; 
    // $scope.newUser.id = '';`` 
    }; 

Соответствующие HTML

<div ng-controller="AppController"> 
    <h1>Testing</h1> 

    <form ng-submit="addUser()"> 
    <input ng-model="newUser.name" placeholder="Your Name"> 
    <input ng-model="newUser.email" placeholder="Email"> 
    <input ng-model="newUser.id" placeholder="Id"> 
    <input type="submit" value="Add User"/> 
    </form> 

    <!-- <button ng-click="addUser()">Add User</button> --> 
    <button ng-click="displayUsers()">View current Users</button>  

    <ul> 
    <li ng-repeat="user in users track by $index" ng-click="removeUser()"> 
     Name: {{ user.name }} <br>Email: {{user.email}} <br> Id: {{user.id}} 
    </li> 
    </ul> 

теперь я понимаю, что вы должны поставить эти 3 линии из-за асинхронной природы JavaScript внутри затем обратного вызова, но почему вы не должны делать то же самое с $ scope.newUser = {}?

+0

Это асинхронное поведение javascript. User.create возвращает обещание, которое будет выполнено (затем метод называется) в будущем. Вы не можете рассматривать его как последовательный код. Переместите код очистки внутри обратного вызова. – Chandermani

+0

Но почему работает $ scope.newUser = {}, даже если он не находится внутри обратного вызова? – WinchenzoMagnifico

ответ

1

Как сказал @Chandermani, это классическая проблема асинхронности, с которой мы все сталкиваемся сначала. Угловые методы в $http и $resource возвращают обещания, которые в будущем будут заполнены или отвергнуты. Кроме того, при рассмотрении обещаний не забывайте всегда обрабатывать ошибки с catch.

$scope.addUser = function() { 
    Users.create($scope.newUser).then(function() { 
    console.log('Second!'); 
    $scope.newUser = {}; 
    }).catch(function (err) { 
    console.log('Something wrong happened!'); 
    }); 

    console.log('First!'); 
}; 
+0

Теперь у меня вопрос, почему вам не нужно иметь $ scope.newUser внутри обратного вызова, и он по-прежнему работает по какой-то причине. $ scope.newUser = {} может находиться вне обратного вызова. – WinchenzoMagnifico

+1

Кто-то исправит меня, если я ошибаюсь, но я думаю, что это потому, что вы создаете новый объект, и фабрика получает ссылку на предыдущий объект (новый пользователь с данными), при этом сброс каждого свойства вручную также мутирует ссылка, используемая на заводе, создавая пустого пользователя. –

+0

Интересно ... это начинает иметь смысл, спасибо! – WinchenzoMagnifico

Смежные вопросы