2016-02-26 31 views
5

góc 1,5 giới thiệu components (loại đặc biệt của chỉ thị)phần tiêm điều khiển góc vấn đề

Đối với chỉ thị chúng ta có thể viết:

app.directive('myDirective', 
      ['$timeout','$mdToast','$rootScope', // <-- injection 
      function ($timeout, $mdToast,$rootScope) { 
return { 
    link: {}, 
    //... 
     } 
    } 

Làm sao chúng ta có thể viết tiêm cho các thành phần?

Chắc chắn tôi có thể viết, một cái gì đó như:

app.component('myComponent', { 
      restrict: 'E', 
      bindings: { 
       data: '=' 
      }, 
      templateUrl: 'template.html', 
      controllerAs: 'vm', 
      controller: 'myComponentCtrl' 
    }); 

và:

app.controller('myComponentCtrl', 
    ['$scope', '$timeout', 
    function ($scope, $timeout) { 
    // .... 
}]); 

Nhưng tôi muốn viết build-in điều khiển, như:

app.component('myComponentCtrl', { 
    templateUrl: 'template.html', 
    controller: function($scope, $timeout) { 
    //... 
    } 
}); 

Minifying style được đề cập ở trên (GRUNT) sẽ phanh mã của tôi Unknown provider: aProvider <- a,

Vì vậy, cách viết đúng cách cho các thành phần?

Bất kỳ ý tưởng nào?

Bản demo tôi sử dụng Plunker

Trả lời

8

Bạn cần phải quấn controller: function($scope, $timeout) { trong cú pháp rút gọn.

Tôi thực sự không phải là một fan hâm mộ của các inline nhưng:

app.component('myComponentCtrl', { 
templateUrl: 'template.html', 
controller: ['$scope', '$timeout', function($scope, $timeout) { 
    //... 
}] 
}); 

Cleaner dạng:

app.component('myComponentCtrl', { 
templateUrl: 'template.html', 
controller: myComponentCtrl 
}) 


myComponentCtrl.$inject = ['$scope', '$timeout']; 
/* @ngInject */ 
function myComponentCtrl($scope, $timeout) { 
    //... 

} 

tùy chọn thứ ba là sử dụng ng-chú thích và bạn có thể loại bỏ các dòng myComponentCtrl.$inject = ['$scope', '$timeout']; trên.

+0

có, tùy chọn thứ nhất là hình thức khá xấu, đồng ý với 'ng-chú thích'. –

+0

Tôi thích ví dụ sạch hơn nhưng tôi không thể hiểu được nó. Tại sao bạn đặt thuộc tính $ inject trên myComponentCtrl trước khi thực sự tạo đối tượng? Ngoài ra bạn đang asigning bộ điều khiển cho một thành phần tuyên bố trước khi thực sự tuyên bố chức năng điều khiển. Nó sẽ hoạt động như thế nào? Tôi nghĩ rằng một cái gì đó là mất tích từ ví dụ sạch hơn. – Liviu

+0

@Liviu Google "javascript cẩu". TL; DR: JavaScript var và khai báo hàm được "hoisted" lên trên cùng của phạm vi, vì vậy bạn có thể khai báo một hàm bất cứ nơi nào trong mã của bạn và truy cập nó theo cách tương tự như bạn đã khai báo nó ngay từ đầu hiện tại phạm vi. –

3

Bạn có thể tiếp tục và sử dụng ký hiệu mảng cho bộ điều khiển của mình.

app.component('myComponent', { 
    restrict: 'E', 
    bindings: { 
     data: '=' 
    }, 
    templateUrl: 'template.html', 
    controllerAs: 'vm', 
    controller: ['$scope', function ($scope) { 

    }] 
}); 

gì tôi thích làm tuy nhiên là sử dụng một công cụ như ng-annotate về xây dựng đường ống dẫn của tôi mà tự động chuyển đổi thuốc chích vào ký hiệu mảng, do đó, mã nguồn của bạn không cần phải lo lắng về điều đó.

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