如何将AngularJS'控制器用作具有多个不同控制器的语法

时间:2015-01-18 11:23:38

标签: angularjs typescript

我是javascript,typescript和AngularJS的新手,目前正在尝试通过构建示例应用来学习该语言。 我是一名经验丰富的程序员,来自Actionscript / Flex背景。

当我来自Actionscript时,我非常喜欢'控制器作为'语法因为我不需要处理漂浮在周围的无类型$ script脚本并执行我无法控制的神奇内容(我认为是不信任javascript的人; - )。

在这个例子中虽然我想创建一个html页面,显示加载数据的各种不同服务的加载信息。我设想使用这个html片段作为页面顶部的标题,可以显示相册列表,图像列表的加载信息,甚至只是在您登录时。

这个例子不是我在制作中会做的,因为有很多事情我不喜欢这种方法,但这是一个学习练习,所以我想弄清楚这是如何工作的。

我有以下TypeScript代码:

LoadingModule

export interface ILoadable
{
    isLoading : boolean;
    isLoaded : boolean;
    loadingMessage : string;
    errorMessage : string;
}

export class LoadingController implements ILoadable
{
    //  Constructor

    constructor( private service? : ILoadable )
    {
    }

    //  Properties

    public get isLoading() : boolean
    {
        return this.service ? this.service.isLoading : true;
    }

    public get isLoaded() : boolean
    {
        return this.service ? this.service.isLoaded : false;
    }

    public get loadingMessage() : string
    {
        return this.service ? this.service.loadingMessage : "Loading...";
    }

    public get errorMessage() : string
    {
        return this.service ? this.service.errorMessage : "There was a fault.";
    }

}

应用

app.config( ($routeProvider) => {
$routeProvider
    .when( '/albums', { templateUrl: './pages/albums.html' } )
    .when( '/album', { templateUrl: './pages/album.html' } )
    .when( '/pictures', { templateUrl: './pages/pictures.html' } )
    .when( '/loggingIn', { templateUrl: './pages/loading.html', controller : "loginController" } )
    .when( '/loadingAlbums', { templateUrl: './pages/loading.html', controller : "loadingAlbumsController" } )
    .when( '/404', { templateUrl: './pages/404.html' } )
    .otherwise( { redirectTo: '/loggingIn' } )
});
app.controller( "loginController", [ "authenticator", Picasa.LoadingController ] );
app.controller( "loadingAlbumsController", [ Picasa.LoadingController ] );

Loading.html

<div ng-controller="loginController as loadable">{{loadable.loadingMessage}}</div>

这一切都很好但我总是将loginController传递到html页面。这显然是因为我在html页面中引用它,所以这会覆盖我在路由提供程序设置中指定控制器。

我的问题是我可以使用&#34;控制器作为&#34;在html页面中设置将注入不同的控制器? 我希望html页面设置与ILoadable一起使用。 我不想将$ scope注入我的控制器并在其上设置属性。

理想情况下,我可以将服务直接注入html页面,这样我就不必拥有控制器包装器。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以使用controllerAs语法进行路由:

$routeProvider
    .when( '/loggingIn', { templateUrl: './pages/loading.html', controller : "loginController", controllerAs: 'login' } )

您的Index.html应该ng-view="",这将取代视图。

这样您就可以在视图中执行{{login.message}}