Объект не знает, что это прямоугольный объект

Сегодня я начал работать с Restangular и Node и столкнулся с проблемой при попытке добавить нового пользователя в список пользователей в моем угловом представлении.

вид.html

<input type="text" ng-model="app.user.name" />
<input type="button" ng-click="app.addUser( app.user )" />

<ul>
    <li ng-repeat="user in app.users">
        <strong>{{ user.name }}</strong>    
        <input type="button" ng-click="app.removeUser( user )" />           
    </li>
</ul>

app.js

var baseUsers = Restangular.all( 'users' );

app.getUsers = function()
{
    baseUsers.getList().then( function( res ) 
    {
        app.users = res;
    });     
};
app.getUsers();

app.addUser = function( newUser )
{               
    baseUsers.post( newUser ).then( function( res ) 
    {
        if( res.success == true )
        {  
            // add new user to scope array
            app.users.push( res.data ); // res.data contains the newly created user
        }       
    }); 
}

app.removeUser = function( oldUser )
{       
    //...
}

Все вышеперечисленное работает хорошо и хорошо, за исключением одной крошечной, но раздражающей проблемы.

Если я добавлю нового пользователя, имя пользователя будет добавлено в список в представлении. НО, когда я нажимаю кнопку удаления рядом с этим пользователем, я получаю эту ошибку: TypeError: Object #<Object> has no method 'remove' at app.removeUser. Я предполагаю, что когда я добавляю только что созданного пользователя в массив области действия так, как я это делаю, он почему-то не знает, что это объект Restangular. Так что я думаю, что проблема заключается в app.users.push( res.data );

Как я могу решить эту проблему?

PS: Когда я обновляю страницу, функция удаления работает. Потому что тогда он снова получает все элементы автоматически через app.getUsers, а не добавляет один элемент вручную через push.


person Ben    schedule 06.04.2014    source источник
comment
Смотрите ответ ниже... Помогает ли это?   -  person dsmithco    schedule 12.04.2014


Ответы (2)


Это именно так, как вы сказали. Новый пользователь, которого вы вставили в массив, просто не был "перестроен". Взгляните на функцию restangularizeElement из Restangular и инициализируйте вновь полученного пользователя, прежде чем вставлять его в массив пользователей.

Что-то подобное:

if( res.success == true )
{  
    // add new user to scope array
    app.users.push(
      Restangular.restangularizeElement('', res.data, 'users')
    );
}

Пустая строка будет означать, что у пользователя нет родительского ресурса.

person bluenavajo    schedule 06.04.2014

Была аналогичная проблема в приложении rails. Я не вижу вашей функции удаления, поэтому я предполагаю. Но в основном Angular не знает, что такое идентификатор для недавно добавленного пользователя, поэтому вам нужно получить его из вашего ответа API при создании пользователя. В моем случае это был контакт.

Мои возможности для нового контакта

$scope.addContact = function () {

    // Use the 'then' method to pass the response 'addedContact' back to you
    Restangular.all('contacts').customPOST($scope.newContact).then(function(addedContact){
        // THIS IS WHERE YOU SET THE ID
        $scope.newContact.id = addedContact.id; 
        // Now it will push the new ID too
        $scope.contacts.push($scope.newContact);

    });
};      

Так что ваш может выглядеть так

app.addUser = function( newUser )
{               
    baseUsers.post( newUser ).then( function( res ) 
    {
        if( res.success == true ) // BTW you might not need this 1st 'then' function is success
        {  
            // Get the ID from the res
            newUser.id = res.data.id // assuming that this will set the ID

            // add new user to scope array
            app.users.push( newUser ); // res.data contains the newly created user
        }       
    }); 
}
person dsmithco    schedule 08.04.2014