2013-01-18 44 views
5

要知道,在angularjs,大部分的邏輯是基於$scope是否有可能讓與原型方法和變量Angularjs工作

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() {} 
} 

現在我使用haXe的生成angularjs代碼,它的工作原理,如果我的代碼是:

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 
} 

但我想從haXe的的等級制度中獲益(代碼可以更簡單,更清晰),宣佈它喜歡:

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

然後找到將Scope類與angularjs的$scope關聯的方法。

但從haXe的生成的Scope使用原型:

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() {} 

在這種情況下,我無法找到一個解決方案,讓與它angularjs工作。

是否有可能讓angularjs與原型一起工作,因此它可以與haxe類系統(還有類似coffeescript/typescript的其他語言一樣支持類)工作?

+0

沒有什麼目的這樣做,如果你想要的代碼可重用位,移動你的方法轉化爲服務。什麼angularJS調用控件不是MVC控制器,它是MVVM設計模式中的ViewModel。真正的控制器在指令中。 – mpm

回答

2

對於具有實際回答這個問題的緣故,應該提到的是,現在這個庫解決了這個問題:https://github.com/freewind/HaxeAngularSupport;)

+0

使用此宏2天后,我不推薦它了。當我以這種方式編寫代碼時,我不能停止思考「它將生成的js代碼是什麼?它是否正確」?太累了。還發現它引入的小錯誤,可能是固定的,但我們需要更多的編碼規則。 – Freewind

+0

@Freewind:如果你想讓這個庫工作,你需要投入時間並在現場進行測試。幾天後你不應該放棄。考慮到圖書館的年輕化程度,以及你對宏觀的認識程度如何,它的形狀都很可觀。你需要改進它 - 最重要的是 - 增加測試。這樣你就會知道這是正確的。讓這個軟件成爲一個可靠的目標。 – back2dos

+0

感謝您的意見。我在等待haxe bug被修復,然後嘗試我的第一種方法。 – Freewind

1

作用域的構造函數是在閉包中聲明的,所以你不能輕鬆訪問它......但(!)JavaScript有構造函數可用於任何現有對象。

理論上,你可以得到$ rootScope的構造函數,改變它的原型,並且應該改變任何後續創建的作用域。但是,您可能希望在應用程序模塊的.run()或.config()中執行此操作。

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

It works and here's the plunker

但是:您可能不需要這樣做。我認爲你可能需要這樣做的唯一原因是在某些邊緣情況下,你需要確保某個作用域上有某個函數或屬性可用,即使它是一個獨立的作用域(就像在我在鏈接中的指令)。

由於存在範圍繼承,並且因爲您有$ rootScope可以使用,所以我無法真正想到需要通過原型設計來更改範圍的任何有效原因。

相關問題