我何时应该在AngularJS中使用不同的控制器

时间:2017-01-31 10:49:29

标签: angularjs

我正在尝试在AngularJS中创建搜索功能。这是我的控制器代码:

app.controller('SearchController',['$scope', '$window','SearchService',  '$cookies' ,'$location','$routeParams',
function($scope,$window, SearchService, $cookies, $location, $routeParams) {
        $scope.homePageSearch = function(search) {
            $scope.result = '';
            $scope.count = '';
            SearchService.setSearchData(search);    
            $window.location.href = '/search/';
        }
        $scope.jobDetail = function(){  
           var slug = $location.absUrl().split('/')[4];
           SearchService.getJobDetail(slug).then(function(data){
                console.log(data)
           });
        }
        var url = $location.absUrl().split('/')[3];
        if(url == 'jobdetail'){
           $scope.jobDetail();
        }
    });   
}]);

我在页面加载时调用homePageSearch函数。在此之后,我将页面重定向到/ jobDetail /并调用函数jobDetail.But问题是homePageSearch()函数也在jobDetail页面上调用如何避免在jobDetail页面上调用homePageSearch()函数。

我应该为/ jobDetail / page使用不同的控制器吗?

我是angularJs的新手请建议我实现这一目标的正确方法。

2 个答案:

答案 0 :(得分:3)

我没有足够的声誉,因为我是新的堆栈溢出,所以我现在正在发布一个答案。

从您的评论中可以看出,您有两个不同的页面。所以,你肯定应该有两个不同的控制器。您可以使用路由器轻松指定。我更喜欢使用ui-router而不是ng-router。

创建router.js文件,如下所示。您可以为每个页面指定控制器,如下所示:

$stateProvider
    .state('login', {
        url: '/',
        templateUrl: '/views/search.html', 
        controller: 'SearchController'
    })
    .state('results', {
        url: '/results',
        templateUrl: '/views/result.html', 
        controller: 'ResultController'
    });

然后,您已经了解了如何使用控制器。更重要的是,请避免使用$window.location.href,因为它会刷新您的网页,这意味着它会重新启动您的应用。

事实上,您应该使用$state.go()(如果您使用的是ui-router)或$location.path()(如果您使用的是ng-router)

答案 1 :(得分:2)

根据您的评论,您似乎有两个功能:

  • 研究页面
  • 结果页

因为它是两个不同页面上的两个不同的东西,我建议你使用两个控制器:每个控制器一个。

始终尝试让控制器变得简单:他们需要知道如何执行特定的任务。

我突出了Angular documentation

中的相关部分
  

通常,控制器不应该尝试做太多。这应该   仅包含单个视图所需的业务逻辑

     

保持控制器苗条的最常用方法是封装工作   不属于控制器的服务然后使用这些   控制器中的服务通过依赖注入。这将在讨论中   本指南的依赖注入和服务部分。

此外,我建议你阅读Divide and conquer,这是一个关于前端架构的有趣指南。