как сделать состояние редактирования angular-xeditable при загрузке отключенным

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

Как сохранить отмену при добавлении новой строки.

//html-код

<div ng-controller="AppSettingsController as appCtrl">
  <button type="button" ng-click="addRandomItem()" class="btn btn-sm btn-success">
    <i class="glyphicon glyphicon-plus">
            </i> Add new record
  </button>
  <table st-table="displayedCollection" st-safe-src="rowCollection" class="table table-striped">
    <thead>
      <tr>
        <th class="sortable" st-sort="parameterkey">Parameter Key</th>
        <th class="sortable" st-sort="description">Description</th>
        <th class="sortable" st-sort="value">Value</th>
        <th class="sortable" st-sort="type">Type</th>
        <th class="sortable" st-sort="active">Active</th>
        <th> Action</th>
      </tr>
      <tr>
        <th colspan="6">
          <input st-search="" class="form-control" placeholder="global search ..." type="text" />
        </th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="row in appCtrl.users">
        <td>
         <span editable-text="row.key" e-name="name" e-form="rowform"  onbeforesave="checkName($data, user.id)" e-required>
          {{ row.key || 'empty' }}
        </span>
       </td>
        <td >{{row.description}}</td>
        <td >{{row.value}}</td>
        <td >{{row.type}}</td>
        <td >{{row.activeYn}}</td>
         <td >
        <!-- form -->
        <form editable-form shown="true" name="rowform" onbeforesave="appCtrl.saveParam($data, row.paramId)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == param">
          <button type="submit" ng-disabled="rowform.$waiting" class="btn btn-primary">
            save
          </button>
          <button type="button" ng-disabled="rowform.$waiting" ng-click="rowform.$cancel()" class="btn btn-default">
            cancel
          </button>
        </form>
        <div class="buttons" ng-show="!rowform.$visible">
          <button class="btn btn-primary" ng-click="rowform.$show()">edit</button>
        </div>  
      </td>
      </tr>
    </tbody>
  </table>
  <div style="padding-bottom: 10px; padding-left: 5px; padding-right: 5px;">
    <button class="btn btn-primary" type="submit" style="float: right; margin-right: 5px;" ng-click="appCtrl.save()">Submit</button>
  </div>
</div>

//JS-код

(function () {
    'use strict';
    angular.module('app.controllers')
        .controller("AppSettingsController",  AppSettingsController);
    app.run(function(editableOptions) {
          editableOptions.theme = 'bs3';
        });
     AppSettingsController.$inject = ['$scope','$http','LookupService','$filter'];
    function AppSettingsController($scope,$http,LookupService,$filter){
        var vm = this;
        vm.users=[];
        vm.param={};
        $http({
            method: 'GET',
            url: 'param/getAllAppParam',
        }).then(function(resp){
            if(resp.data.result != null && resp.data.result != undefined && resp.data.code == 0 && resp.data.result!=false){
                vm.users=resp.data.result;
            }
            else{
                vm.successMsg = "";
                vm.errorMsg = "Error occured in Server..!User Could not be saved..!";
                console.log(vm.errorMsg);
                vm.saved = false;
            }
        });

            //copy the references (you could clone ie angular.copy but then have to go through a dirty checking for the matches)
           // $scope.displayedCollection = [].concat($scope.rowCollection);

            //add to the real data holder
            $scope.addRandomItem = function addRandomItem() {
                $scope.rowCollection.unshift({
                  /*  "paramId": "<input ng-model='row.description'/>",
                    "value": "",
                    "activeYn": "",
                    "description": "",
                    "type": "",
                    "query": "",
                    "key": ""*/
                  });
            };

            //remove to the real data holder
            $scope.removeItem = function removeItem(row) {
                var index = $scope.rowCollection.indexOf(row);
                if (index !== -1) {
                    $scope.rowCollection.splice(index, 1);
                }
            }


            vm.saveParam = function(data, paramId) {
               console.log("param Id :"+paramId);

               angular.extend(data, {paramId: paramId});
               console.log("save :"+ JSON.stringify(data));
                //return $http.post('/saveUser', data);
              };

            vm.save = function(){
                 $http({
                        method: 'POST',
                        url: 'param/saveAppParam',
                        data: vm.param
                    }).then(function(resp){
                        if(resp.data.result != null && resp.data.result != undefined && resp.data.code == 0 && resp.data.result!=false){
                            vm.errorMsg ="";
                            /*vm.clear();*/
                            /*vm.successMsg=resp.data.message + " Registration Id:"+ resp.data.result.regId;*/
                            vm.saved = true;
                        }
                        else{
                            vm.successMsg = "";
                            vm.errorMsg = "Error occured in Server..!User Could not be saved..!";
                            console.log(vm.errorMsg);
                            vm.saved = false;
                        }

                    });
                };
    }

    })();

person user630209    schedule 31.01.2016    source источник
comment
shown="true" означает, что форма изначально разорвана в показанном (редактируемом) состоянии   -  person Beartums    schedule 31.01.2016
comment
если я удалю это также, это то же самое.   -  person user630209    schedule 31.01.2016
comment
а shown="inserted==param"? это правда на начальном дисплее?   -  person Beartums    schedule 31.01.2016
comment
это должно быть показано = вставлено == appCtrl.param   -  person user630209    schedule 31.01.2016
comment
@Beartums Как сохранить и отменить добавление новой строки (addRandomItem()). при добавлении новой строки. Я добавил это в вопрос.   -  person user630209    schedule 31.01.2016


Ответы (1)


Есть много способов перевести строку в редактируемое состояние при добавлении новой строки, но я бы сделал это со списком appCtrl.users, а не пытался возиться с x-редактируемой формой строки.

добавление нового пользователя в массив appCtrl.users создаст новую строку. Вы можете добавить атрибут пользователя (.isNew), который может быть истинным, когда вы вставляете форму, и всегда имеет значение false после обновления. Тогда shown="row.isNew" должен работать.

если вы не можете изменить свою объектную модель, вы помещаете нового пользователя в массив newUsers, а затем используете shown="appCtrl.newUsers.indexOf(row)>-1", должно работать. в onafterupdate вам придется удалить пользователя из массива.

ОБНОВЛЕНИЕ: насколько я могу судить из кода, если вы хотите, чтобы новая строка была редактируемой при запуске функции addRandomUser, функция должна выглядеть так:

     $scope.addRandomItem = function addRandomItem() {
            $scope.inserted = {
                "paramId": "<input ng-model='row.description'/>",
                "value": "",
                "activeYn": "",
                "description": "",
                "type": "",
                "query": "",
                "key": ""*/
              });
            $scope.users.push($scope.inserted)
     };

тогда ваш html для формы строки должен выглядеть так:

<form editable-form shown="true" name="rowform"
        onbeforesave="appCtrl.saveParam($data, row.paramId)" 
        ng-show="rowform.$visible" class="form-buttons form-inline" 
        shown="appCtrl.inserted == row">
    <div class="buttons" ng-show="rowform.$visible">
      <button type="submit" ng-disabled="rowform.$waiting" 
              class="btn btn-primary">
        save
      </button>
      <button type="button" ng-disabled="rowform.$waiting"  
              ng-click="rowform.$cancel()" class="btn btn-default">
        cancel
      </button>
    </div>  
      <button class="btn btn-primary" ng-show="!rowform.$visible"
              ng-click="rowform.$show()">edit</button>
</form>

Это должно сделать строку доступной для редактирования при вставке нового пользователя. Возможно, вам потребуется установить insert={} в вашей функции saveUser, и я еще не просмотрел ваши функции редактирования.

Кроме того, я думаю, вам нужно создать кнопку добавления для вызова вашей функции addRandomUser.

person Beartums    schedule 31.01.2016
comment
@user630209 user630209, я не верю, что у xeditable есть способ пометить форму как «новую», поэтому я думаю, что ответ — нет. Вы можете использовать метод, аналогичный ответу выше, и либо поместить форму строки в массив newObjects, либо добавить свойство isNew в форму строки, но я думаю, что лучше сделать это с реальной моделью, а не со сторонними директивами. - person Beartums; 31.01.2016
comment
jsfiddle.net/NfPcH/93 - я видел эту скрипку, которая отлично работает. - person user630209; 01.02.2016
comment
Да. По сути, эта скрипка делает многое из того, что я предложил, только с одним объектом isNew (вставленным), а не с массивом - создает новую пользовательскую строку в области видимости и устанавливает, что этот пользователь будет таким же, как пользователь $scope.inserted, указывая, что это должно быть показано. Это все происходит без какой-либо ссылки на форму строки в контроллере. - person Beartums; 01.02.2016
comment
так как я не понимаю, как это работает, пытаюсь воспроизвести код. В моем коде для каждой новой строки добавлена ​​кнопка редактирования вместо кнопки сохранения. что тут может быть не так. - person user630209; 01.02.2016
comment
Значение USERS: {paramId:, ключ:, описание:, значение:, тип:, activeYn: null} appSettings.js: 55: 1 ВСТАВЛЕННОЕ значение: {paramId:, ключ:, описание:, значение:, тип:, activeYn :null} хотя эти значения совпадают, кнопка сохранения не отображается - person user630209; 01.02.2016
comment
Можете ли вы обновить приведенный выше код, чтобы отразить то, что вы сейчас тестируете? Я не вижу выше, где установлены inserted или param (и я почти уверен, что они оба должны быть свойствами appCtrl) - person Beartums; 01.02.2016
comment
Внесены изменения в ответ - person Beartums; 01.02.2016