如何在控制器内部告知是否已从ng-controller或路径运行

时间:2013-06-27 06:57:35

标签: javascript angularjs

我有一个AngularJS控制器,它在路由中定义的特定页面上使用:

when("/search/:term", {controller:'SearchCtrl',  templateUrl:'/static/templates/supersearch/list.html'});

并附加到标题中的元素,该元素在所有页面上使用:

<div ng-controller="SearchCtrl">
  <form class="navbar-form pull-left super-search">
    ...
  </form>
<div>

如何从控制器中告知它正在运行的上下文?

我尝试过的事情:

NG-INIT

我尝试使用<div ng-controller="SearchCtrl" ng-init="init(true)">告诉控制器它是否从头部搜索表单运行,但似乎ng-init在控制器之后执行,因此它无法访问传递的参数。

传递$元素

如果我将$element注入控制器,我可以访问附加ng-controller指令的DOM节点,但是对于带有路由的页面,angular会引发错误,因为没有$element可供注射。

所以我要么需要某种方法将参数传递给控制器​​,或者某种方式来告诉控制器正在运行的上下文(内联ng-controller与路由)。谢谢!

2 个答案:

答案 0 :(得分:2)

我建议使用注入的$routeParams service将案例区分到控制器的函数中。

答案 1 :(得分:1)

搜索的实际处理必须在服务层中完成。不在控制器中。 基本上将两个控制器合并为一个可能会导致一系列问题。

考虑拥有两个控制器。一个用于完整搜索,一个用于标题搜索。 这两个控制器都会注入Search服务来处理搜索。

app.controller('HeaderSeachController', function (Search) {
    Search.headerSearch();
});

app.controller('SeachController', function (Search) {
    Search.search();
});

app.service('Search', function () {
    return {
        headerSearch: function () { ... },
        search: function () { ... },
        _sharedLogic: function () { ... }
    };
});