2013-01-18 32 views
5

Bạn biết đấy, trong angularjs, hầu hết các logic dựa trên $scope:Có thể để cho công việc Angularjs với các phương pháp nguyên mẫu và các biến

function Ctrl($scope) { 
    $scope.name = "Freewind"; 
    $scope.hello = function() { 
     alert($scope.name); 
    } 
    $scope.method1 = function() {} 
    $scope.method2 = function() {} 
    $scope.method3 = function() {} 
    $scope.method4 = function() {} 
    $scope.method5 = function() {} 
} 

Bây giờ tôi đang sử dụng để tạo ra haXe angularjs mã, nó hoạt động nếu mã của tôi là:

class Ctrl { 
    public function new(scope:Scope) { 
     scope.name = "Freewind"; 
     scope.hello = function() { 
     alert(scope.name); 
     } 
     scope.method1 = function() {} 
     scope.method2 = function() {} 
     scope.method3 = function() {} 
     scope.method4 = function() {} 
     scope.method5 = function() {} 
    } 
} 

typedef Scope = { 
    name:String, 
    hello:Void->Void, 
    method1: Void->Void, 
    method2: Void->Void, 
    method3: Void->Void, 
    method4: Void->Void, 
    method5: Void->Void 
} 

Nhưng tôi muốn được hưởng lợi từ hệ thống lớp haXe của (mã có thể được đơn giản và rõ ràng hơn), để khai báo nó thích:

class Scope { 
    public var name:String; 
    public function hello() {} 
    public function method1() {} 
    public function method2() {} 
    public function method3() {} 
    public function method4() {} 
    public function method5() {} 
} 

Sau đó, tìm cách liên kết lớp học Scope với số $scope của angularj.

Nhưng tạo Scope từ haXe đang sử dụng nguyên mẫu:

Scope = function(); 
Scope.prototype.name = "something"; 
Scope.prototype.hello = function() {} 
Scope.prototype.method1 = function() {} 
Scope.prototype.method2 = function() {} 
Scope.prototype.method3 = function() {} 
Scope.prototype.method4 = function() {} 
Scope.prototype.method5 = function() {} 

Trong trường hợp này, tôi không thể tìm ra giải pháp để cho angularjs làm việc với nó.

Có thể cho phép angularjs làm việc với nguyên mẫu, vì vậy nó có thể làm việc với hệ thống lớp haxe (cũng các ngôn ngữ khác như coffeescript/typescript có hỗ trợ lớp)?

+0

không có mục đích làm điều đó, nếu bạn muốn bit tái sử dụng mã, di chuyển của bạn phương pháp vào dịch vụ. Điều khiển gọi angularJS không phải là bộ điều khiển MVC, nó là một ViewModel trong mẫu thiết kế MVVM. bộ điều khiển thực sự nằm trong chỉ thị. – mpm

Trả lời

2

Vì lợi ích của việc có một câu trả lời thực tế cho câu hỏi này, ta nên đề cập đến mà bây giờ thư viện này giải quyết vấn đề: https://github.com/freewind/HaxeAngularSupport;)

+0

Sau khi sử dụng macro này trong 2 ngày, tôi không khuyên bạn sử dụng nó nữa. Khi tôi viết mã theo cách đó, tôi không thể ngừng suy nghĩ "mã js nó sẽ tạo ra là gì? Có đúng không"? Nó quá mệt mỏi. Và cũng tìm thấy các lỗi nhỏ mà nó đã giới thiệu, có thể được sửa, nhưng chúng tôi cần thêm quy tắc để mã hóa. – Freewind

+0

@Freewind: Nếu bạn muốn thư viện này hoạt động, bạn sẽ cần phải đầu tư thời gian và thử nghiệm nó trên thực địa. Bạn không nên bỏ cuộc sau một vài ngày. Xem xét thư viện trẻ và bạn mới sử dụng macro như thế nào, nó ở trong một hình dạng đáng kính. Bạn cần phải tinh chỉnh nó và - quan trọng nhất - thêm các bài kiểm tra. Bằng cách đó bạn sẽ biết nó là chính xác. Làm điều này một phần vững chắc của phần mềm là một mục tiêu đạt được. – back2dos

+0

cảm ơn lời khuyên của bạn. Tôi đang chờ lỗi haxe đó được sửa, sau đó thử phương pháp đầu tiên của tôi. – Freewind

1

Phương thức khởi tạo của phạm vi được khai báo trong phạm vi đóng, vì vậy bạn không có quyền truy cập dễ dàng ... BUT (!) JavaScript có hàm tạo sẵn cho bạn ngay lập tức của bất kỳ đối tượng hiện có nào.

Về mặt lý thuyết, bạn có thể lấy hàm tạo $ rootScope, thay đổi nguyên mẫu của nó và điều đó sẽ thay đổi bất kỳ phạm vi được tạo sau đó. Bạn có thể muốn làm điều này trong .run() hoặc .config() trên module ứng dụng của bạn, tuy nhiên.

app.run(function($rootScope) { 
    $rootScope.constructor.prototype.foo = 'Set from prototype'; 
}); 

It works and here's the plunker.

BAO GIỜ: Bạn có thể không cần thực hiện việc này. Lý do duy nhất tôi có thể nghĩ rằng bạn có thể cần phải làm điều này là trong một số trường hợp mà bạn cần đảm bảo một số chức năng hoặc thuộc tính có sẵn trên phạm vi, ngay cả khi nó là một phạm vi riêng biệt (như là chỉ thị trong plunker tôi liên kết).

Vì có kế thừa phạm vi và vì bạn có $ rootScope để sử dụng, tôi thực sự không thể nghĩ ra bất kỳ lý do hợp lệ nào cần thay đổi Phạm vi thông qua tạo mẫu.

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