Подтвердить что ты не робот

Ng-init, если массив еще не создан

Я пытаюсь создать шаблон для приложения и хочу отображать динамический список с именами. поэтому я получил этот код, чтобы показать список и добавить/удалить строки;

<table ng-init="page.businessRows = []">
<thead>
    <tr>
        <th>Company</th>
        <th>Contact</th>
        <th>Phone</th>
    </tr>
</thead>
    <tr ng-repeat="row in page.businessRows">
        <td>
            <input type="text" ng-model="row.name" />
        </td>
        <td>
            <input type="text" ng-model="row.contact" />
        </td>
        <td>
            <input type="text" ng-model="row.phone" />
        </td>
        <td>
            <button ng-click="page.businessRows.splice($index,1)">
                Remove
            </button>
        </td>
    </tr>
</table>
<button class="btn" ng-click="page.businessRows.push({})">addRow</button>

вещь, как при загрузке этого шаблона page.busnessRows, скорее всего, будет загружена строками, поэтому я хочу изменить ng-init, чтобы создать пустой массив, если businessRows не инициализирован.

Я пробовал ng-init="page.businessRows = page.businessRows.length < 1 ? [] : page.businessRows, но это не сработало. Как я намерен выполнять условия в jsangular выражениях?

Вся помощь оценивается. Спасибо заранее

4b9b3361

Ответ 1

Вместо этого вы можете сделать это:

<table ng-init="page.businessRows = page.businessRows || []">

Обновить

Я смотрю на код парсера AngularJS и замечаю, что версия 1.2 (в настоящее время RC) поддерживает тройное выражение. Поэтому, если вы используете AngularJS 1.2, это также будет работать (хотя и более подробный, чем приведенный выше код):

<table ng-init="page.businessRows = page.businessRows == null ? [] : page.businessRows">

Смотрите демо здесь.

Однако исходный код может не работать, если page.businessRows есть null, потому что синтаксический анализатор не сможет разыскать length свойство null. Так что будьте осторожны.

Ответ 2

Я не думаю, что ng-init будет правильно оценивать условные утверждения. Но вы можете реорганизовать условие в функцию контроллера и вызвать функцию из ng-init.

<table ng-init="initializeBusinessRows(page.businessRows)">

Просто положите свою условную оценку в функцию на область контроллера.

Ответ 3

Я думаю, вы пытаетесь решить неправильную проблему.

Проблема заключается в том, что вы разрешаете действие, прежде чем данные будут загружены или готовы. Вторая проблема заключается в том, что вы используете выражение в ng-click, где должна быть функция области видимости или функция контроллера.

Итак...

  • Отключить эту кнопку, если форма не готова.
  • Используйте ваш контроллер для управления этими взаимодействиями.

Итак, вот пример контроллера. Тайм-аут $был добавлен для имитации задержки загрузки данных в вашу переменную $scope.page.

app.controller('MyCtrl', function($scope, $timeout, $window) { 
  //Timeout to simulate the asynchronous load
  //of the page object on the $scope
  $timeout(function(){
    $scope.page = {
      businessRows: []
    };
  }, 2000);


  //scope method to add a row.
  $scope.addRow = function (){
    //for safety sake, check to see if the businessRows array is there.
    if($scope.page && angular.isArray($scope.page.businessRows)) {
      $scope.page.businessRows.push({});
    }
  };

  //scope method to remove a row
  $scope.removeRow = function(index, row) {
    if($window.confirm('Are you sure you want to delete this row?')) {
      $scope.page.businessRows.splice(index, 1);
    }
  };
});

... и вид HTML (обратите внимание на ng-disabled и ng-click) (и отсутствие ng-init):

  <div ng-controller="MyCtrl">
    <table>
      <thead>
        <tr>
            <th>Company</th>
            <th>Contact</th>
            <th>Phone</th>
        </tr>
      </thead>
      <tbody>
        <tr ng-repeat="row in page.businessRows">
            <td>
                <input type="text" ng-model="row.name" />
            </td>
            <td>
                <input type="text" ng-model="row.contact" />
            </td>
            <td>
                <input type="text" ng-model="row.phone" />
            </td>
            <td>
                <button ng-click="removeRow($index, row)">
                    Remove
                </button>
            </td>
        </tr>
      </tbody>
    </table>
    <button class="btn" ng-disabled="!page" ng-click="addRow()">addRow</button>
  </div>

Кроме того, здесь обязательный Plunker для вас, чтобы увидеть это в действии.