2014-07-27 14 views
5

tôi có:Tôi có thể tránh sử dụng từ "this" bên trong Typescript khi gọi một hàm đến thông qua một hàm tạo không?

class AdminHomeController { 

    private config1; // I tried different variations here but none worked 
    public config2; // 

    constructor(
       private $scope: IAdminHomeControllerScope 
       ) { 
        this.config = $scope.config; // << this works 
       } 

    static $inject = [ 
     '$scope' 
    ]; 

    configChanged = (clear) => { 
     this.config.clear(); 
    }; 

} 

Mã này hoạt động và this.config có tất cả các phương pháp tôi cần. Tuy nhiên, có cách nào mà tôi có thể xóa nhu cầu cho số this không? Những gì tôi muốn có thể làm là viết mã như sau:

configChanged = (clear) => { 
    config.clear(); 
}; 

Tôi đã thử với nhiều biến thể khác nhau nhưng tôi không thể làm cho nó hoạt động.

Dưới đây là một ví dụ về mã cùng trước khi chuyển sang nguyên cảo:

angular.module('admin') 
    .controller('AdminHomeController', [ 
     '$http', 
     '$q', 
     '$scope', 
     'utilityService', 
     adminHomeController]); 

function adminHomeController(
    $http, 
    $q, 
    $scope, 
    utilityService 
    ) { 

    var app = $scope.app; 
    var config = app.config; 
    var home = this; 
    var util = utilityService; 

    home.autoSave = false; 
    home.data = {}; 
    home.entityType = null; 
    home.forms = { grid: null, modal: null }; 
    home.grid = { view: [], data: [] }; 
    home.modal = { visible: false }; 
    home.row = {}; 
    home.rowSelected = null; 

    home.configChanged = function (clear) { 
     config.put(); 
     if (clear) { 
      home.grid.backup = []; 
      home.grid.data = []; 
     } 
    }; 
+0

tại sao? . . .. . – djechlin

+1

Vâng trước khi tôi đã sử dụng javascript chỉ giải pháp của tôi trông sạch sẽ. Bây giờ các giải pháp có từ "này" ở phía trước của hầu hết các cuộc gọi chức năng. Trong một số trường hợp, tôi có gần 100 cuộc gọi hàm tìm kiếm theo cách này. –

+0

Việc bỏ 'điều này' sẽ làm cho mã của bạn có ý nghĩa khác trong JavaScript. Đây không phải là Java hoặc C# hoặc C++ ... –

Trả lời

3

Như djechilin nói:

Nếu bạn bỏ qua "này," người phiên dịch sẽ chỉ đơn giản là tìm kiếm các tên biến trong phạm vi địa phương, closured và toàn cầu, không thực sự nhìn lên thuộc tính đối tượng

Vì vậy, bạn có khả năng có thể làm điều đó trong TypeScript bằng cách di chuyển hàm định nghĩa vào phần thân của hàm tạo (nơi bạn có quyền truy cập vào biến đóng cửa $scope). Ở đây chúng tôi cũng đóng trên config và sau đó sử dụng nó trong chức năng:

class AdminHomeController { 

    configChanged:()=>void; // Need to declare the function 

    constructor(private $scope: any) { 
     var config = $scope.config; 
     this.configChanged =()=> { // And then assign it 
      config.clear(); 
     }; 
    } 
} 

Như bạn có thể thấy, nó không thanh lịch. Bạn có định nghĩa hàm + khai báo tách. Ngoài ra, cơ thể của nhà xây dựng đang trở nên không cần thiết nặng nề.

TypeScript không được đổ lỗi ở đây. Nó chỉ là JavaScript.

0

Trong javascript chắc chắn không phải, và trong nguyên cảo Tôi khá chắc chắn không. Tài liệu tham khảo trong Javascript ràng buộc từ vựng, không phải bất cứ cách nào khác được gọi. Nếu bạn bỏ qua "this", trình thông dịch sẽ đơn giản tìm kiếm tên biến trong các phạm vi cục bộ, bị đóng và toàn cục, không thực sự tìm kiếm các thuộc tính đối tượng. Bạn sẽ cần một số loại cờ phép thuật để nói "biến này là một thuộc tính đối tượng" và cách thực hiện điều này là với "điều này".

này là rất bình thường trong Javascript. Các ngôn ngữ được biên dịch như Java không gặp vấn đề này và tôi không chắc chắn về các ngôn ngữ động khác. Nó không nhất thiết phải khó giải quyết; nó không chỉ là cách JS đã làm mọi thứ (được cho là sai).

+0

Bạn đề cập đến "nó không phải là rất khó để giải quyết". Có cách nào ea tôi có thể giải quyết nó cho nhu cầu của tôi. – Alan2

+0

@ Vâng, tôi tin rằng không có khó khăn về mặt lý thuyết khi viết một ngôn ngữ mới biên dịch thành JS và không có vấn đề này. – djechlin

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