5

你知道,在 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类和$scopeangularjs的关联起来。

但是Scope从 haxe 生成的是使用原型:

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 类系统(也可以使用其他语言,如具有类支持的咖啡脚本/打字稿)?

4

2 回答 2

2

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

于 2013-01-22T17:10:36.957 回答
1

Scope 的构造函数是在闭包中声明的,因此您无法轻松访问它...但是(!)JavaScript 可以在任何现有对象上立即使用该构造函数。

从理论上讲,您可以获得 $rootScope 的构造函数,更改它的原型,这应该会更改任何随后创建的 Scope。但是,您可能希望在应用程序模块的 .run() 或 .config() 中执行此操作。

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

它有效,这是 plunker

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

因为有作用域继承,并且因为你有 $rootScope 可以使用,所以我真的想不出任何需要通过原型来改变作用域的正当理由。

于 2013-01-18T14:33:01.700 回答