AngularJS是否可以与原型方法和变量一起使用?

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 类与 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)一起使用?

如果你想要可重用的代码片段,把你的方法移到服务中是没有意义的。AngularJS所称的控制器并不是MVC控制器,而是MVVM设计模式中的ViewModel。真正的控制器在指令中。 - mpm
2个回答

2

使用这个宏两天后,我不再推荐它了。当我以那种方式编写代码时,我无法停止思考“它将生成什么js代码?是否正确?”太累了。而且还发现了一些引入的小错误,可能已经修复,但我们需要更多的编码规则。 - Freewind
@Freewind:如果你想让这个库工作,你需要投入时间在实际应用中进行测试。几天后就放弃是不应该的。考虑到这个库还很年轻而且你对宏还很新,它已经处于一个可观的状态了。你需要加以完善,最重要的是添加测试。这样你就会知道它是否正确。使它成为一个坚实的软件是可以实现的目标。 - back2dos
谢谢您的建议。我正在等待Haxe bug修复,然后尝试我的第一种方法。 - Freewind

1

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

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

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

它有效,这是plunker的链接

然而:你可能不需要这样做。我能想到的唯一原因是在某些边缘情况下,您需要确保某个函数或属性在作用域上可用,即使它是一个隔离的作用域(就像我链接中指令中的作用域一样)。

由于存在作用域继承,并且您有$rootScope可以使用,我真的想不出任何需要通过原型来更改Scope的有效原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接