2013-06-13 48 views
34

Vì vậy, tôi mới sử dụng AngularJS và tôi đang cố gắng xây dựng một ứng dụng danh sách rất đơn giản, nơi tôi có thể tạo danh sách mục ng lặp lại và sau đó đẩy một mục đã chọn vào một mục khác danh sách ng-lặp lại. Mặc dù vấn đề của tôi dường như rất đơn giản nhưng tôi đã không thể tìm ra một giải pháp phù hợp.Làm thế nào để đẩy các đối tượng trong AngularJS giữa các mảng ngRepeat

Vì vậy, đây là đánh dấu đơn giản:

<body ng-app="MyApp"> 
<div id="MyApp" ng-controller="mainController"> 

    <div id="AddItem"> 
     <h3>Add Item</h3> 

     <input value="1" type="number" placeholder="1" ng-model="itemAmount"> 
     <input value="" type="text" placeholder="Name of Item" ng-model="itemName"> 
     <br/> 
     <button ng-click="addItem()">Add to list</button> 
    </div> 
    <!-- begin: LIST OF CHECKED ITEMS --> 
    <div id="CheckedList"> 
     <h3>Checked Items: {{getTotalCheckedItems()}}</h3> 

     <h4>Checked:</h4> 

     <table> 
      <tr ng-repeat="item in checked" class="item-checked"> 
       <td><b>amount:</b> {{item.amount}} -</td> 
       <td><b>name:</b> {{item.name}} -</td> 
       <td> 
        <i>this item is checked!</i> 

       </td> 
      </tr> 
     </table> 
    </div> 
    <!-- end: LIST OF CHECKED ITEMS --> 
    <!-- begin: LIST OF UNCHECKED ITEMS --> 
    <div id="UncheckedList"> 
     <h3>Unchecked Items: {{getTotalItems()}}</h3> 

     <h4>Unchecked:</h4> 

     <table> 
      <tr ng-repeat="item in items" class="item-unchecked"> 
       <td><b>amount:</b> {{item.amount}} -</td> 
       <td><b>name:</b> {{item.name}} -</td> 
       <td> 
        <button ng-click="toggleChecked($index)">check item</button> 
       </td> 
      </tr> 
     </table> 
    </div> 
    <!-- end: LIST OF ITEMS --> 
    </div> 
</body> 

Và đây đi AngularJS tôi Script:

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

app.controller("mainController", 

function ($scope) { 

// Item List Arrays 
$scope.items = []; 
$scope.checked = []; 

// Add a Item to the list 
$scope.addItem = function() { 

    $scope.items.push({ 
     amount: $scope.itemAmount, 
     name: $scope.itemName 
    }); 

    // Clear input fields after push 
    $scope.itemAmount = ""; 
    $scope.itemName = ""; 

}; 

// Add Item to Checked List and delete from Unchecked List 
$scope.toggleChecked = function (item, index) { 
    $scope.checked.push(item); 
    $scope.items.splice(index, 1); 
}; 

// Get Total Items 
$scope.getTotalItems = function() { 
    return $scope.items.length; 
}; 

// Get Total Checked Items 
$scope.getTotalCheckedItems = function() { 
    return $scope.checked.length; 
}; 
}); 

Vì vậy, khi tôi bấm nút, toggleChecked của tôi() chức năng gây ra và nó thực sự đẩy thứ gì đó vào danh sách đã kiểm tra của tôi. Tuy nhiên, nó có vẻ chỉ là một vật thể trống rỗng. Hàm không thể nhận được mục thực sự mà tôi muốn đẩy.

Tôi đang làm gì sai ở đây?

LƯU Ý: Kiểm tra các mục qua nhấp chuột vào nút được dự định. Tôi không muốn sử dụng hộp kiểm trong trường hợp này.

Bạn có thể xem mô hình làm việc ở đây: http://jsfiddle.net/7n8NR/1/

Chúc mừng, Norman

Trả lời

34

thay đổi phương pháp của bạn:

$scope.toggleChecked = function (index) { 
    $scope.checked.push($scope.items[index]); 
    $scope.items.splice(index, 1); 
}; 

Working Demo

7

Bạn muốn được tốt hơn tắt bằng cách sử dụng cùng một mảng với cả hai danh sách và tạo ra angul ar bộ lọc để đạt được mục tiêu của bạn.

http://docs.angularjs.org/guide/dev_guide.templates.filters.creating_filters

Rough, mã chưa được kiểm tra sau:

appModule.filter('checked', function() { 
    return function(input, checked) { 
     if(!input)return input; 
     var output = [] 
     for (i in input){ 
      var item = input[i]; 
      if(item.checked == checked)output.push(item); 
     } 
     return output 
    } 
}); 

và quan điểm (i thêm một "bỏ chọn" nút quá)

<div id="AddItem"> 
    <h3>Add Item</h3> 

    <input value="1" type="number" placeholder="1" ng-model="itemAmount"> 
    <input value="" type="text" placeholder="Name of Item" ng-model="itemName"> 
    <br/> 
    <button ng-click="addItem()">Add to list</button> 
</div> 
<!-- begin: LIST OF CHECKED ITEMS --> 
<div id="CheckedList"> 
    <h3>Checked Items: {{getTotalCheckedItems()}}</h3> 

    <h4>Checked:</h4> 

    <table> 
     <tr ng-repeat="item in items | checked:true" class="item-checked"> 
      <td><b>amount:</b> {{item.amount}} -</td> 
      <td><b>name:</b> {{item.name}} -</td> 
      <td> 
       <i>this item is checked!</i> 
       <button ng-click="item.checked = false">uncheck item</button> 

      </td> 
     </tr> 
    </table> 
</div> 
<!-- end: LIST OF CHECKED ITEMS --> 
<!-- begin: LIST OF UNCHECKED ITEMS --> 
<div id="UncheckedList"> 
    <h3>Unchecked Items: {{getTotalItems()}}</h3> 

    <h4>Unchecked:</h4> 

    <table> 
     <tr ng-repeat="item in items | checked:false" class="item-unchecked"> 
      <td><b>amount:</b> {{item.amount}} -</td> 
      <td><b>name:</b> {{item.name}} -</td> 
      <td> 
       <button ng-click="item.checked = true">check item</button> 
      </td> 
     </tr> 
    </table> 
</div> 
<!-- end: LIST OF ITEMS --> 

Sau đó, bạn không cần các phương pháp chuyển đổi vv trong điều khiển của bạn

+0

Tôi nghĩ về một cái gì đó tương tự như lúc đầu, nhưng tôi sợ rằng bộ điều khiển của tôi sẽ trở nên quá lộn xộn khi dự án trở nên phức tạp hơn. Ví dụ: nếu tôi sẽ thêm một trạng thái khác ngoài "được chọn" và "bỏ chọn" và sử dụng lại các mục với các trạng thái khác nhau trong các chế độ xem khác, mọi thứ sẽ khó khăn hơn. Giữ các mục của tôi được sắp xếp trong nhiều bộ điều khiển có thể sẽ giữ mã của tôi sạch sẽ hơn và sau này tôi sẽ linh hoạt hơn trong dự án. – VoodooDS

-6

Hãy thử này cũng ...

<!DOCTYPE html> 
 
<html> 
 

 
<body> 
 

 
    <p>Click the button to join two arrays.</p> 
 

 
    <button onclick="myFunction()">Try it</button> 
 

 
    <p id="demo"></p> 
 
    <p id="demo1"></p> 
 
    <script> 
 
    function myFunction() { 
 
     var hege = [{ 
 
     1: "Cecilie", 
 
     2: "Lone" 
 
     }]; 
 
     var stale = [{ 
 
     1: "Emil", 
 
     2: "Tobias" 
 
     }]; 
 
     var hege = hege.concat(stale); 
 
     document.getElementById("demo1").innerHTML = hege; 
 
     document.getElementById("demo").innerHTML = stale; 
 
    } 
 
    </script> 
 

 
</body> 
 

 
</html>

+2

Tránh javascript trong dom với AngularJS. –

Các vấn đề liên quan