2015-03-30 3 views
2

У меня есть таблица, и ее tr повторяется ng. можно также добавить к нему новую строку, нажав кнопку.Как получить значение из входного текста, который ng-повторяется Tr?

Теперь предположим, что tr повторяется 3 раза, и мы добавляем к нему 2 дополнительных строки и вводим некоторые данные. когда мы нажимаем кнопку отправки, как мы можем получить все данные таблицы в контроллере.

Ну я получил ответ на это Но мой фактический сценарий, как это Мой HTML страницы, как этот

<div ng-repeat="details in Information" > 
<!-- 

my other stuff 

--> 

<table> 
    <thead> 
     <tr> 
      <th>name</th> 
      <th>age</th> 
      <th>city</th> 
      <th>add</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr ng-repeat="detail in details.personInfo"> 
      <td><input type="text" ng-model="detail.name" /></td> 
      <td><input type="text" ng-model="detail.age" /></td> 
      <td><input type="text" ng-model="detail.city" /></td> 
      <td><input type="text" ng-model="detail.add" /></td> 
      <td><input type="button" ng-click="addnewRow();" /> </td> 
     </tr> 
    <tbody> 
</table> 
<input type="button" ng-click="SaveDetails();" value="SaveDetais"/> 

</div> 

My Controller является:

$scope.addnewRow = function(){ 
    var newRow = "<tr>"+ 
     "<td><input type='text' ng-model='detail.name' /></td>"+ 
     "<td><input type='text' ng-model='detail.age' /></td>"+ 
     "<td><input type='text' ng-model='detail.city' /></td>"+ 
     "<td><input type='text' ng-model='detail.add' /></td>"+ 
     "<td><input type='button' ng-click='addnewRow();' /> </td>"+ 
     "</tr>"; 

    $("table tbody").append(newRow); 

} 


$scope.SaveDetails = function(){ 
    // how i will get all to data from the input fields her 
} 

Теперь, как я могу нажать данные в этом. Как когда я сделать

$scope.details.personInfo.push({..}) 

это дает мне ошибку «personInfo» не определяют Тогда для этого сценария, как это должно быть сделано

+0

You 'compile' элемент перед добавлением –

ответ

0

Для начала, вы не хотите делать Dóm манипуляции в контроллере ,

Если вы хотите $scope.SaveDetails (Конвенция для функций, не конструктор в JavaScript является CamelCase), что я хотел бы сделать, это вместо того, чтобы добавлять разметку, я хотел бы добавить новую запись в details массива:

$scope.addnewRow = function(){ 
    $scope.details.push({SOMEDETAILOBJECT}) 
} 


$scope.SaveDetails = function(){ 
    //some sort of ajax update call that sends $scope.details 
} 
+0

, как я хочу, чтобы добавить новую строку, как могу ли я нажать его в $ scope.details или что я должен нажать. PLS, вы можете объяснить, так как это поможет мне дальше – shoaib

+0

Вы должны добавить объект javascript, который имеет ту же структуру, что и объекты, уже подробно описанные.Так подробно объекты выглядят как это по вашему образцу кода: { имя: «имя» возраст: 21 город: «город» дополню: правда } –

-1

Вы пытались просто получить детали из сферы действия?

$scope.SaveDetails = function(){ 
    $scope.details 
} 
+0

бы это дало мне значения для вновь добавленных строк также ?? поскольку эта строка изначально не была частью ng-repeat, а также «детали» поступает из другого значения ng-repeat – shoaib

+0

В текущей реализации это не сработает, потому что добавленные строки теперь являются частью 'details' –

+0

Yup, thats correct , добавление элементов DOM по jQuery не является хорошей идеей при использовании Angular, мне плохо. – miszczak

1

У вас есть проблема с дизайном, которая становится наиболее очевидной при создании вызова jQuery. В качестве очень сильного эмпирического правила вам не следует манипулировать DOM (в частности, вызовом jQuery) в Angular, особенно в вашем контроллере.

Ваша addnewRow() функция должна выглядеть

$scope.addnewRow = function(){ 
    $scope.details.push({}) 
} 

Тогда вам не нужно даже saveDetails функцию - details автоматически обновляется!

+0

детали будут автоматически обновляться по области, но вам понадобится функция, чтобы сохранить ее на сервере, поэтому saveDetails все еще может быть необходимо –

+0

@SamJacobs Правда, но он не упоминал об этом, так что я оставляю его. В любом случае функция 'save' становится намного проще. –

+0

согласился! просто хотел добавить эту точку разъяснения :) –

0

Вам нужно изменить подход.

Функция addnewRow, вместо этого добавление элемента в DOM должно добавлять новые детали к вашему массиву деталей, а угловая обновит вашу таблицу. Данные в таблице представляют $scope.details массив, так что если вы хотите получить в контроллер просто использовать $scope.details

var app = angular.module('app', []); 
 

 
app.controller('firstCtrl', function($scope) { 
 

 
    function detail(name, age, city, add) { 
 
    this.name = name || ""; 
 
    this.age = age || ""; 
 
    this.city = city || ""; 
 
    this.add = add || ""; 
 

 
    return this; 
 
    } 
 

 
    $scope.details = [{ 
 
    name: "ammin", 
 
    age: "16", 
 
    city: "NY", 
 
    add: "true" 
 
    }, { 
 
    name: "joe", 
 
    age: "80", 
 
    city: "CH", 
 
    add: false 
 
    }]; 
 

 
    $scope.addnewRow = function() { 
 

 
    var newDetai = new detail() 
 
    $scope.details.push(newDetai) 
 

 
    } 
 

 
    $scope.save = function() { 
 

 
    console.log($scope.details); 
 
    $scope.saved = true 
 

 
    } 
 

 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<body ng-app="app"> 
 
    <div ng-controller="firstCtrl"> 
 
    <table> 
 
     <thead> 
 
     <tr> 
 
      <th>name</th> 
 
      <th>age</th> 
 
      <th>city</th> 
 
      <th>add</th> 
 
     </tr> 
 
     </thead> 
 
     <tbody> 
 
     <tr ng-repeat="detail in details"> 
 
      <td> 
 
      <input type="text" ng-model="detail.name" /> 
 
      </td> 
 
      <td> 
 
      <input type="text" ng-model="detail.age" /> 
 
      </td> 
 
      <td> 
 
      <input type="text" ng-model="detail.city" /> 
 
      </td> 
 
      <td> 
 
      <input type="text" ng-model="detail.add" /> 
 
      </td> 
 
      <td> 
 
      <input type="button" ng-click="addnewRow();" /> 
 
      </td> 
 
     </tr> 
 
     <tbody> 
 
    </table> 
 
    <pre ng-show="saved">Details:{{details| json}}</pre> 
 
    <button ng-click="save()">Save</button> 
 
    </div> 
 
</body>

+0

Спасибо, что это отлично работает, но когда «детали», т.е. переменная $ scope.details, не поступает непосредственно от контроллера, а вместо нее происходит от другого ng-повторного значения, то как мы можем нажимать значения в это добавить новую строку. Спасибо – shoaib

+0

@shoaib, когда вы используете ng-repeter в своем представлении, он всегда привязан к вашей модели, т. Е. Ng-repeat = «значение в значениях» привязывается к $ scope.values, поэтому вам нужно нажать новое значение в свою область $. значения – sylwester

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