2013-08-02 33 views
18

Tôi có một ứng dụng có chế độ xem ngà sẽ gửi email đến số liên lạc được chọn từ danh sách liên lạc. Khi người dùng chọn "Người nhận", người dùng có thể tìm kiếm, lọc, v.v. "Gửi email" và "Danh sách liên hệ" là các phần tách html khác nhau được tải trong chế độ xem ng.Bảo tồn trạng thái với Giao diện người dùng góc-Bộ định tuyến

Tôi cần giữ trạng thái gửi biểu mẫu để khi người dùng chọn ai đó từ Danh sách liên hệ, nó quay trở lại cùng một điểm (và cùng một tiểu bang). Tôi đọc về các giải pháp khác nhau ($ rootScope, div ẩn bằng cách sử dụng ng-show, ...) nhưng tôi muốn biết liệu UI-router có giúp tôi với State Manager hay không. Nếu không, có các giải pháp sẵn sàng sử dụng khác không?

Cảm ơn!

+0

thể trùng lặp của [AngularJS - lưu dữ liệu giữa các tuyến] (http://stackoverflow.com/questions/16802857/angularjs-saving-data-between-routes) –

Trả lời

21

Giải pháp tôi đã sử dụng là sử dụng dịch vụ làm lưu trữ dữ liệu/mô hình của tôi. chúng tồn tại qua các thay đổi của bộ điều khiển.

dụ

các dịch vụ sử dụng (mô hình của chúng tôi mà vẫn tồn tại qua những thay đổi controller)

app.factory('userModel', [function() { 
    return { 
     model: { 
      name: '', 
      email: '' 
     } 
    }; 
}]); 

sử dụng nó trong một bộ điều khiển

function userCtrl($scope, userModel) { 
    $scope.user = userModel; 
} 

lợi thế khác của việc này là bạn có thể tái sử dụng mô hình của bạn trong các bộ điều khiển khác cũng dễ dàng.

+0

Tôi đã sử dụng dịch vụ đã sử dụng. Nó trông ổn đấy. Nhưng nếu mô hình được tạo dựa trên tham số tuyến đường (ví dụ: $ routeParams.myId) thì sao? –

+2

bạn sẽ lưu trữ kết quả trong dịch vụ chứ không phải bộ điều khiển. mọi thứ khác có thể giống nhau – Anton

+2

Có vẻ như ví dụ của bạn chưa hoàn chỉnh, bạn cần một cách để thay đổi [broadcast] (http://onehungrymind.com/angularjs-communicating-between-controllers/) trong mô hình dịch vụ của mình cho các bộ điều khiển khác. [Ví dụ này] (http://stackoverflow.com/a/16559855/168815) cũng có tài khoản để lưu trạng thái khi điều hướng khỏi ứng dụng hoàn toàn. –

2

Tôi đã tìm thấy Angular-Multi-View làm ơn trời cho trường hợp này. Nó cho phép bạn bảo toàn trạng thái trong một chế độ xem trong khi các chế độ xem khác đang xử lý tuyến đường. Nó cũng cho phép nhiều khung nhìn xử lý cùng một tuyến đường.

Bạn có thể thực hiện điều này bằng UI-Router nhưng bạn sẽ cần phải lồng các khung nhìn mà IMHO có thể trở nên xấu xí.

8

Tôi không chắc chắn nếu điều này được khuyến khích hay không, nhưng tôi đã tạo một StateService để lưu/tải thuộc tính từ phạm vi của bộ điều khiển của tôi. Nó trông giống như thế này:

(function(){ 
    'use strict'; 

    angular.module('app').service('StateService', function(){ 

     var _states = {}; 

     var _save = function(name, scope, fields){ 
      if(!_states[name]) 
       _states[name] = {}; 
      for(var i=0; i<fields.length; i++){ 
       _states[name][fields[i]] = scope[fields[i]]; 
      } 
     } 
     var _load = function(name, scope, fields){ 
      if(!_states[name]) 
       return scope; 
      for(var i=0; i<fields.length; i++){ 
       if(typeof _states[name][fields[i]] !== 'undefined') 
        scope[fields[i]] = _states[name][fields[i]]; 
      } 
      return scope; 
     } 

     // ===== Return exposed functions ===== // 
     return({ 
      save: _save, 
      load: _load 
     }); 

    }); 
})(); 

Để sử dụng nó, tôi đặt một số mã ở phần cuối của bộ điều khiển của tôi như thế này:

angular.module('app').controller('ExampleCtrl', ['$scope', 'StateService', function ($scope, StateService) { 
    $scope.keyword = ''; 
    $scope.people = []; 

    ... 

    var saveStateFields = ['keyword','people']; 
    $scope = StateService.load('ExampleCtrl', $scope, saveStateFields); 
    $scope.$on('$destroy', function() { 
     StateService.save('ExampleCtrl', $scope, saveStateFields); 
    }); 
}]); 
+0

dường như là một giải pháp khả thi đối với tôi. Bạn đã chứng minh thành công với quá trình này chưa? Bây giờ tôi cần phải thực hiện một cơ chế để bảo toàn trạng thái. Greets Mario – SQueek

+1

Tôi đã không sử dụng nó trong một ứng dụng sản xuất, nhưng ứng dụng trong phát triển của tôi đang sử dụng mã này và dường như hoạt động khá tốt. –

+0

Siêu việc làm Justin! Đồng nghiệp của tôi rất hài lòng với giải pháp! Chúc bạn một ngày cuối tuần vui vẻ. – SQueek