5

Tôi đã tạo một chỉ thị để hiển thị dữ liệu. Tôi có thể bao gồm nó trong một ng-lặp lại và thấy rằng mô hình được kết nối. Khi tôi nhấp và quay lại trang, dữ liệu được hiển thị lại với các thay đổi đã thực hiện trước đó. Tôi đã sử dụng ngResources để tải dữ liệu từ một API. Cho đến nay, rất tốt: nó hoạt động như mong đợi.Các mục sẽ biến mất khi được lưu

Đây là phần bị ngắt: nếu tôi lưu dữ liệu vào API trong chỉ thị của tôi, mục sẽ biến mất khỏi trang (cụ thể hơn, nó được vẽ với các trường trống). Phần còn lại của các mục vẫn như trước. Chỉ một thay đổi đã lưu.

Dưới đây là chỉ thị:

.directive('action', function() { 
    return { 
     restrict: 'E', 
     scope: { 
      data:'=model' 
     }, 
     templateUrl: 'modules/actions/view.tpl.html', 
     replace: true, 
     link: function(scope, element, attr) { 
      scope.save = function() { 
       console.log(" data to save:" + JSON.stringify(scope.data)); 
       scope.data.$save(); 
      } 
     } 
    }; 
}) 

Các html kết hợp với chỉ thị bao gồm:

<p><input type="text" ng-model="data.assignee" ng-change="save()"> 

Sau đây là cách chỉ thị được sử dụng:

<div ng-repeat="item in data"> 
    <action model="item" /> 
</div> 

Dưới đây là một fiddle cho thấy bối cảnh bổ sung . Bạn có thể thấy chỉ thị cơ bản làm việc với một số dữ liệu giả mạo. Mã cho cuộc gọi API được nhận xét.

Một lần nữa, sự cố xảy ra khi đường dây scope.data.$save(); không được chú ý. Khi mục được hiển thị trong ng-repeat cố gắng tự lưu, nó sẽ biến mất khỏi danh sách các mục được hiển thị, được thay thế bằng một mục có các trường trống. Khi tôi tải lại toàn bộ ứng dụng, tôi thấy rằng API lưu thành công và mục bây giờ hiển thị chính xác.

Điều tôi nghi ngờ xảy ra là cuộc gọi lưu hoạt động đúng mục nhưng bằng cách nào đó thay thế mục đã thay đổi bằng một mục mới, trống, có thể do thừa kế nguyên mẫu. Lưu sau đó gây ra một bản cập nhật cho phạm vi cha mẹ, mà vẽ lại danh sách và hiển thị các mục blanked mới.

Ai đó có thể làm rõ điều gì đang xảy ra và cách khắc phục sự cố không?

Trả lời

4

Tôi nghĩ rằng bạn sẽ thấy rằng phản hồi HTTP cho lệnh $save() của bạn đang trả về dữ liệu trống.

Đây là cách hoạt động của $resource. Khi bạn gọi $save(), nó sẽ (theo mặc định) gọi dịch vụ REST của bạn với một POST HTTP. Phản hồi được mong đợi là trạng thái máy chủ của tài nguyên. Kết quả sau đó được sao chép vào đối tượng của bạn. Trong trường hợp này, tôi đoán rằng dịch vụ REST của bạn đang trả về một đối tượng rỗng.

Nói cách khác, nếu bạn gửi POST có nội dung là {name: 'foo'}, bạn mong đợi phản hồi từ máy chủ là một cái gì đó như {id: 44, name: 'foo', extraInfoServerCreated: 'bar'}.

+1

Bạn nói đúng. Có máy chủ trả lại dữ liệu đã lưu hoàn toàn giải quyết được sự cố. Cảm ơn! – CodeGuy2001

+0

Hoặc trả về một phản hồi trống nếu điều đó dễ dàng hơn vì nó sẽ buộc mục gốc được sử dụng thay vì dữ liệu phản hồi – cyberwombat

+0

@Yashua Bạn có chắc chắn không? Tôi nghĩ rằng Angular '$ resource' sẽ thay thế dữ liệu bằng bất cứ thứ gì bạn trả về từ dịch vụ REST ... vì vậy nếu bạn trả về rỗng, nó sẽ xóa mô hình của bạn. –