【问题标题】:UI Router controller not working when view is pulled in with $templateCache?使用 $templateCache 拉入视图时 UI 路由器控制器不工作?
【发布时间】:2016-06-07 23:52:21
【问题描述】:

我正在使用gulp-angular-templatecache 将我所有的filename.view.html 文件转换为templates.js 文件。

然后我使用$stateProvider 创建我的状态并使用$templateCache 提取模板,并带有抽象的“根”状态。

$stateProvider
    .state('app', {
        abstract: true,
        template: '<div ui-view></div>'
    })
    .state('app.login', {
        url: '/login',
        template: $templateCache.get('components/login/login.html'),
        controller: 'LoginController as login'
    });

到目前为止,一切正常。模板按应有的方式加载到我的页面中,但无论我做什么,我都无法让控制器工作。

我的模块和相关的控制器比较简单:

(function () {

    'use strict';

    angular
        .module('login', [])
        .controller('LoginController', LoginController);

    function LoginController () {

        var vm = this;

        vm.loginID = 'test';
        vm.password = 'test';

        vm.doLoginRequest = function () {
            console.log('Performing login request...');
        }

    }

})();

我已经尝试了几种不同的方法,但似乎都没有奏效:

  • 将模板移至模块的.run(...) 部分,并将其推入$templateCache
  • 状态配置中 templatetemplateUrltemplateProvider 的不同变体
  • 从状态中删除 controllerAs 语法并改用 ng-controller
  • 使用旧式控制器语法(即不是 controllerAs 语法)

有人对我如何解决此问题有任何建议吗?我已经把头发扯了好几个小时了!

【问题讨论】:

  • 如何包含控制器的login 模块。你也不需要打电话给$templateCache.get()。你可以做templateUrl: 'components/login/login.html'
  • 你的路由是否定义为登录模块下的配置?你的路由定义了哪个模块?
  • login 模块只是作为我的主应用程序模块的依赖项包含在内。我的所有路由都在 .config(...) 块中一起定义,作为主应用程序模块的一部分,例如angular.module('app', ['login']).config(function ($stateProvider) { .... });
  • 为了篇幅,我没有在这里展示依赖注入,但我向你保证我也正确地使用了依赖注入:)
  • @rob 感谢您确认我可以使用 templateUrl。我现在已经更新了这些,但我的问题仍然存在:(

标签: javascript angularjs angular-ui-router angular-templatecache


【解决方案1】:

事实证明,我在我的登录模板上使用了 &lt;form&gt; 元素,出于某种原因 Angular 确实喜欢它。我猜我错误地实现了 &lt;form&gt; 以使其与 Angular 一起工作。

删除 &lt;form&gt; 元素可以解决问题。

【讨论】:

    【解决方案2】:

    如何预加载模板:

    1) 运行你的任务,生成 template.js 视图

    2) 在您的索引文件中,预加载所有模板

      <script src="build/templates.js"></script>
    

    3) 包含你的模块作为依赖(自动任务通常会创建一个单独的模块,确保你检查,模块的名称是什么)

    angular.module('app', ['templates'])
    

    4) 在 app.config 部分中,只需引用视图,就好像您在没有缓存的情况下加载它们一样

     .state('home', {
            url: '/home',
            views: {
                "@": {
                    controller: 'homeController',
                    templateUrl: 'app/views/home.html'
    
                },
            }
    
        })
    

    【讨论】:

    • 我已经在执行步骤 1-3 并且模板在我的应用程序中显示良好。只有控制器不起作用。我已尝试使用您的 .state 设置,如第 4 步中所述,但我的路线不再显示(并且不会在我的控制台中引发任何错误)。
    • 我记得在寻找问题的解决方案时,我曾看到 @ 单独使用而不是 content@。我已经尝试过了,然后路线再次显示,但控制器仍然无法工作。
    • @Pot-Nut content@ - 来自您的视图标记。更多文档在这里:github.com/angular-ui/ui-router/wiki/… 我从视图中删除了“内容”,因为这确实会产生误导。换句话说,它正在寻找视图,这就是所谓的“内容”,你发现了一个问题,这很好
    猜你喜欢
    • 2017-02-11
    • 2016-12-24
    • 2016-01-25
    • 1970-01-01
    • 2012-08-08
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多