Javascript 角度:如何制作“a”;搜索“;带您到另一条路线并显示结果?

Javascript 角度:如何制作“a”;搜索“;带您到另一条路线并显示结果?,javascript,angularjs,Javascript,Angularjs,我有一个带有导航的主页,每个导航选项都会将您带到另一条路线。它看起来就像一个单页应用程序,但每个“页面”都有自己的路由和控制器 我的问题是我想在导航栏中放置一个搜索框。当有人使用搜索框时,我希望将用户带到“搜索”路径,然后显示结果。我很难弄清楚这两个问题: 我在哪里存储这个“搜索框”逻辑?例如,当有人搜索时,他们从下拉列表中选择搜索类型,然后在输入框中选择搜索查询。我有特殊的逻辑根据输入框中键入的值自动选择哪个下拉值 如何重定向到 “搜索”路线并根据来自的输入显示结果 上一页 很明显我是一个新手

我有一个带有导航的主页,每个导航选项都会将您带到另一条路线。它看起来就像一个单页应用程序,但每个“页面”都有自己的路由和控制器

我的问题是我想在导航栏中放置一个搜索框。当有人使用搜索框时,我希望将用户带到“搜索”路径,然后显示结果。我很难弄清楚这两个问题:

  • 我在哪里存储这个“搜索框”逻辑?例如,当有人搜索时,他们从下拉列表中选择搜索类型,然后在输入框中选择搜索查询。我有特殊的逻辑根据输入框中键入的值自动选择哪个下拉值
  • 如何重定向到 “搜索”路线并根据来自的输入显示结果 上一页

  • 很明显我是一个新手。我很高兴能解决细节问题,但我主要想了解如何构建这个问题的解决方案。提前感谢您的帮助。

    我最喜欢的是您可以应用的选项数量

    您的目标可以通过使用服务来实现。服务是可以从控制器请求的单例类。作为一个单身者,您在服务中存储的任何值都可供所有控制器使用。您可以使用$watch查看值更改、使用$broadcast通知数据更改或使用$routeParams发送带有路由更改的数据

    服务的构建如下所示:

    下面假设您有一个名为“app”的全局模块变量

    app.service('myService', function(){
    
         var myValue;
    
         this.getMyValue = function(){
            return myValue;
         };           
    
         this.setMyValue = function(value){
            myValue = value;
         };
    });
    
    然后,像请求$scope这样的角度服务一样,从控制器请求服务

    app.controller('myController', ['$scope', 'myServce', function($scope, myService){
    
        $scope.myValue = myService.getMyValue();
    
        //Example watch
        $scope.$watch('myValue',function(){
           //Search criteria changed!!
        }, true);
    
    }]);
    

    Angular非常棒。享受编码乐趣基本上你希望搜索页面有自己的状态,所以我们从这里开始(我希望你使用ui路由器,而不是Angulars内置路由器):

    如您所见,我为搜索字符串定义了一个附加参数,该参数不是URL的一部分。当然,如果愿意,您可以更改该参数,并将参数移到URL:

    .state('search', {
        url: "/search/:searchString",
        templateUrl: "pages/search.html",
        controller: 'SearchController as ctrl'
    })
    
    实际的搜索输入也非常简单,因为它只是HTML:

    <input type="text" ng-model="searchString" on-key-enter="ctrl.goSearch(searchString)">
    
    有趣的是我添加的on-key-enter指令:

    angular.module('your.module')
        .directive('onKeyEnter', OnKeyEnter);
    
    function OnKeyEnter() {
        return function (scope, element, attrs) {
            element.bind("keydown keypress", function (event) {
                if(event.which === 13) {
                    scope.$apply(function (){
                        scope.$eval(attrs.onKeyEnter);
                    });
                    event.preventDefault();
                }
            });
        };
    }
    
    按enter键时,它将调用作为属性值提供的函数。当然,您也可以使用带有ng click的按钮来代替此指令,但我认为它看起来更好

    最后,但并非最不重要的是,您需要一个搜索控制器和一个用于搜索页面的HTML模板,我不会提供给您,因为这里显示的内容取决于您。对于控制器,您只需要知道如何访问搜索字符串:

    angular.module('your.module')
        .controller('SearchController', SearchController);
    
    SearchController.$inject = ['$scope', '$stateParams'];
    
    function SearchController($scope, $stateParams) {
        $scope.searchString = $stateParams.searchString;
    
        /* DO THE SEARCH LOGIC, e.g. database lookup */
    }
    

    希望这有助于找到正确的方法。:)

    你有两个相当大的问题挤在一个问题里;就他们自己而言,这些问题中的每一个都是博客或教程中的完整主题;总之,这个问题太广泛,无法充分处理,这意味着如果你收到任何答案,他们几乎不会触及任何有用的东西的表面。从非常广泛的意义上说,这听起来像是一个指令的候选者,以及显示结果的独特路线/页面。谢谢克莱斯,我没有意识到
    angular.module('your.module')
        .directive('onKeyEnter', OnKeyEnter);
    
    function OnKeyEnter() {
        return function (scope, element, attrs) {
            element.bind("keydown keypress", function (event) {
                if(event.which === 13) {
                    scope.$apply(function (){
                        scope.$eval(attrs.onKeyEnter);
                    });
                    event.preventDefault();
                }
            });
        };
    }
    
    angular.module('your.module')
        .controller('SearchController', SearchController);
    
    SearchController.$inject = ['$scope', '$stateParams'];
    
    function SearchController($scope, $stateParams) {
        $scope.searchString = $stateParams.searchString;
    
        /* DO THE SEARCH LOGIC, e.g. database lookup */
    }