angularjs - example - ng-repeat array
Edición en línea de AngularJS dentro de ng-repeat (3)
Estoy trabajando con AngularJS para mostrar una tabla de teclas de aplicación (identificadores de aplicación) y me gustaría usar un botón de edición para mostrar un formulario pequeño en esa fila de la tabla. Luego el usuario puede editar los campos y hacer clic en "guardar" o "cancelar"
Demostración: http://jsfiddle.net/Thw8n/
Tengo la forma en línea funcionando muy bien. Hago clic en editar y aparece un formulario. Cancelar funciona muy bien también.
Mi problema es
- ¿Cómo conecto el botón de guardar con una función que hará una llamada $ http a una API?
- ¿Cómo obtengo los datos de esa fila para enviarlos a la llamada $ http?
- ¿Cómo deshabilito
editModeuna vez que la llamada vuelve?
Aquí está el código real que estoy usando en mi controlador (en el JSFiddle no puedo hacer la llamada http). El primer $ http completa el formulario, la función editAppKey es lo que se llama con el botón Guardar.
function AppKeysCtrl($scope, $http, $location) {
$http({
method: ''POST'',
url: ''http://'' + $location.host() + '':1111/sys/appkey/save'',
data: {
// How do I get the data?
}
}).
success(function(data, status, headers, config) {
$scope.appkeys = data;
}).
error(function(data, status, headers, config) {
$scope.appkeys = [{ "appkey" : "ERROR", "name" : "ERROR", "created" : "ERROR" }];
});
$scope.editAppKey = function() {
$http({
method: ''POST'',
url: ''http://'' + $location.host() + '':1111/sys/appkeys''
}).
success(function(data, status, headers, config) {
alert("Success!");
$scope.editMode = false;
}).
error(function(data, status, headers, config) {
alert("There was an error.");
});
}
}
Cuando presionamos el botón "Editar" y cambiamos uno de los campos, también cambiamos nuestras principales appkeys modelo. Significa que en "Cancelar" necesitamos restaurar el modelo antiguo.
Significa que necesitamos al menos:
Así que esto es un fragmento de HTML:
<td>
<button type="submit" data-ng-hide="editMode" data-ng-click="editMode = true; editAppKey(entry)" class="btn btn-default">Edit</button>
<button type="submit" data-ng-show="editMode" data-ng-click="editMode = false; saveField()" class="btn btn-default">Save</button>
<button type="submit" data-ng-show="editMode" data-ng-click="editMode = false; cancel()" class="btn btn-default">Cancel</button>
</td>
Y nuestro controlador:
$scope.newField = {};
$scope.editing = false;
$scope.appkeys = [
{ "appkey" : "0123456789", "name" : "My new app key", "created" : tmpDate },
{ "appkey" : "abcdefghij", "name" : "Someone elses app key", "created" : tmpDate }
];
$scope.editAppKey = function(field) {
$scope.editing = $scope.appkeys.indexOf(field);
$scope.newField = angular.copy(field);
}
$scope.saveField = function() {
if ($scope.editing !== false) {
$scope.appkeys[$scope.editing] = $scope.newField;
$scope.editing = false;
}
};
$scope.cancel = function() {
if ($scope.editing !== false) {
$scope.appkeys[$scope.editing] = $scope.newField;
$scope.editing = false;
}
};
Demo Fiddle
[EDITAR]
Si desea editar varias filas a la vez, use la matriz de newFields lugar de $scope.newField
En caso de que alguien necesite edición múltiple a la vez:
Solo haz lo siguiente:
en el botón de cancelación de html, pase el índice index data-ng-click="editMode = false; cancel($index)"
en el lado JS:
1) $scope.newField = {}; a $scope.newField = [];
2) dentro de la función editAppKey , $scope.newField = angular.copy(field); a $scope.newField[$scope.editing] = angular.copy(field);
3) cambiar la función saveField a:
$scope.saveField = function(index) {
$scope.appkeys[$scope.editing] = $scope.newField;
};
4) cambiar la función de cancel a:
$scope.cancel = function(index) {
$scope.appkeys[index] = $scope.newField[index];
$scope.editing = false;
};
Puede pasar, por ejemplo, el índice actual como un parámetro a la función editAppKey ():
... data-ng-click="editAppKey($index)"
y en el archivo JS:
$scope.editAppKey = function(index) {
window.console.log(appkeys[index]); // do what ever you want
}
en cuanto a la desactivación una vez que la solicitud está de vuelta. Si lo comprendo, desea permitir solo una edición de tiempo y después de llamar a editAppKey () una vez en una fila, desactívela, ¿verdad? Si es así, tal vez algo como
<button type="submit" data-ng-hide="editMode" data-ng-click="editMode = true" class="btn btn-default"
data-ng-disabled="entry.isDisabled">Edit</button>
y en la función editAppKey (), algo como
$scope.editAppKey = function(index){
$http.post(url, data).onsuccess(function(){
$scope.appkeys[index].isDisabled = true;
});