是否可以让Angularjs使用原型方法和变量

时间:2013-01-18 10:57:47

标签: javascript class angularjs haxe

你知道,在angularjs中,大多数逻辑基于$scope

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,它们有类支持)?

2 个答案:

答案 0 :(得分:2)

为了对这个问题有一个实际的答案,我们应该提一下,现在这个库解决了这个问题:https://github.com/freewind/HaxeAngularSupport;)

答案 1 :(得分:1)

Scope的构造函数在闭包中声明,因此您无法轻松访问它... BUT(!)JavaScript可以为任何现有对象提供构造函数。

理论上,你可以获得$ rootScope的构造函数,改变它的原型,并且应该改变任何后来创建的Scopes。但是,您可能希望在应用程序模块上的.run()或.config()中执行此操作。

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

It works and here's the plunker

但是:您可能不需要这样做。我可以想到你可能需要这样做的唯一原因是在一些边缘情况下你需要确保某个功能或属性在一个范围内可用,即使它是一个孤立的范围(就像在在我连接的plunker中的指令)。

因为有范围继承,并且因为你要使用$ rootScope,所以我无法想到需要通过原型设计来改变Scope的任何正当理由。