2013-03-25 19 views
26

Tôi đã xác định một bộ điều khiển và áp dụng cho 2 chế độ xem có sự khác biệt nhỏ.Làm cách nào để sử dụng lại một bộ điều khiển cho 2 chế độ xem khác nhau?

đang kiễu góc:

app.controller('MyCtrl', function($scope) { 
    $scope.canSave = false; 
    $scope.demo = { 
     files : [{ 
     filename: 'aaa.html', 
     source: '<div>aaa</div>' 
     }, { 
     filename: 'bbb.html', 
     source: '<div>bbb</div>' 
     }] 
    } 
    $scope.newFile = function(file) { 
     $scope.demo.files.push(file); 
    } 
    $scope.$watch("demo.files", function(val) { 
     $scope.canSave = true; 
    }, true); 
}); 

Xem 1:

<div ng-controller="MyCtrl"></div> 

View 2:

<div ng-controller="MyCtrl"></div> 

Mẫu mã rất đơn giản, nhưng có rất nhiều mã và logic trong dự án thực sự của tôi.

Chế độ xem 1 và 2 có hầu hết các tính năng giống nhau, chỉ với một vài khác biệt, nhưng tôi cần phải viết một số mã cho mỗi bộ điều khiển trong bộ điều khiển.

Tôi không muốn tạo 2 bộ điều khiển khác nhau cho chúng, vì chúng có hầu hết cùng một logic. Tôi không muốn chuyển logic sang một dịch vụ để chia sẻ nó giữa 2 bộ điều khiển, bởi vì logic không phải là phổ biến để trở thành một dịch vụ.

Có cách nào khác để làm điều đó không?

+0

Vì vậy, chỉ cần đặt tất cả mọi thứ bạn cần cho cả hai quan điểm trong đó một bộ điều khiển và bạn đã sẵn sàng để đi ... – finishingmove

+1

Logic không cần phải được sử dụng bất cứ nơi nào và ở khắp mọi nơi để di chuyển nó đến một dịch vụ. Một dịch vụ cần phải là nơi mà hầu hết logic của bạn nên đi, cho dù nó được chia sẻ hay không. – ganaraj

Trả lời

16

Theo các điều kiện cho tôi có thể làm một cái gì đó giống như

function MyCommonCtrl(type){ 
    return function($scope, $http) { 
     $scope.x = 5; 

     if(type = 't1'){ 
      $scope.domore = function(){ 
      } 
     } 

     .... 
     .... 
    } 
} 

angular.module('ng').controller('Type1Ctrl', ['$scope', '$http', MyCommonCtrl('t1')]); 
angular.module('ng').controller('Type2Ctrl', ['$scope', '$http', MyCommonCtrl('t2')]); 

Sau đó

<div ng-controller="Type1Ctrl"></div> 

<div ng-controller="Type2Ctrl"></div> 
+1

Đối với tôi, điều này trông giống như một hack nhưng giống như một giải pháp. Do đó -1. Tôi thích giải pháp sạch bằng cách sử dụng thừa kế được gợi ý bằng cách @axzr tốt hơn. –

+1

Đây thực sự là một giải pháp tồi tệ mà tôi nghĩ. – fdomig

+3

Tôi thích giải pháp này - một phương pháp javascript truyền thống thực sự có chức năng trượt, với ít nếu có bất kỳ hạn chế nào. Hoàn toàn có thể kiểm tra, linh hoạt và dễ hiểu. Thừa kế là nhiều khả năng để cung cấp cho bạn đau đầu xuống đường vì nó hoạt động ít rõ ràng và thêm phức tạp w/r để sở hữu và thừa kế tài sản. –

6

Tôi không biết cụ thể thiết lập của bạn, nhưng 2 của bạn bộ điều khiển có thể kế thừa từ một tổ tiên chung.

Type1Ctrl.prototype = new MyCtrl(); 
Type1Ctrl.prototype.constructor = Type1Ctrl; 

function Type1Ctrl() { 
    // constructor stuff goes here 
} 

Type1Ctrl.prototype.setScope = function() { 
    // setScope 
}; 

Type2Ctrl.prototype = new MyCtrl(); 
Type2Ctrl.prototype.constructor = Type2Ctrl; 

function Type2Ctrl() { 
    // constructor stuff goes here 
} 

Type2Ctrl.prototype.setScope = function() { 
    // setScope 
}; 
+0

Tôi chưa bao giờ viết bộ điều khiển như thế này, bạn có thể cho tôi thêm một số thông tin về nó không? – Freewind

+0

@Freewind: chắc chắn rồi. Bạn có thể đăng một chút logic hơn từ bộ điều khiển hiện tại của bạn và tôi có thể giúp bạn định hình chúng để sử dụng thừa kế? Hoặc là hoặc chỉ làm một số đọc lên trên thừa kế trong Javascript. – axzr

+0

Cảm ơn @axzr, hãy xem câu hỏi được cập nhật của tôi. – Freewind

3

Tôi cũng gặp vấn đề tương tự và kế thừa phạm vi đã giải quyết được sự cố của mình. Tôi muốn "tái sử dụng" bộ điều khiển để thừa hưởng trạng thái/mô hình (phạm vi $) và chức năng (các chức năng điều khiển gắn với phạm vi $) Như được mô tả trong "Scope Inheritance Example" Tôi đính kèm bộ điều khiển cha vào phần tử DOM bên ngoài và bộ điều khiển con bên trong . Phạm vi và chức năng của bộ điều khiển cha mẹ "hợp nhất" liền mạch vào con một.

+0

Đây được coi là thực hành không tốt trong Angular.JS 1.3+ – Thomas

3

Đây là một tùy chọn khác. Chút thay đổi từ this blog post

app.factory('ParentCtrl',function(){ 
    $scope.parentVar = 'I am from the parent' 
    }; 
}); 

app.controller('ChildCtrl', function($scope, $injector, ParentCtrl) { 
    $injector.invoke(ParentCtrl, this, {$scope: $scope}); 
}); 

here is a plunker

+0

Liên kết bị hỏng tới bài đăng trên blog. –

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