javascript - 如何实现下拉列表更改事件捕获功能

标签 javascript angularjs dropdown

我的 html 文件中有这样的内容:

<select ng-model="selectedCar" ng-change="changedValue(selectedCar)" ng-options="x.license for x in fhu.carList" >
        <option value="">Select Car</option>
</select>

如何以及在何处将changedValue函数放入我的 Controller 中?我对 Angular 和 JavaScript 有点陌生,所以一个具体的例子会很好。我的 Controller 位于下方,下拉列表填充正在工作... almost 。但这是另一个问题了,此时选择更改功能更为重要。

(function() {
    var app = angular.module("fhu", []);

    app.controller("FhuController", function(){

        this.carList = cars;

    });


    $(document).ready(function(){

        var car = {};

        $.getJSON("fillingapi.php?action=get_cars",function(data){
             var i=0;
             for(i=0;i<data.length;i++){

                cars.push( {license: data[i].license, descr: data[i].descr});               

            }
        });
    });

    var cars=[];

    })();

最佳答案

回答你的问题:“在我的 Controller 中将changedValue放在哪里” 您已经通过执行 ng-model="selectedCar"获得了。 Angular 会为你更新它。因此,在您的 Controller 中,您可以执行 $scope.selectedCar 并获取从下拉列表中选择的汽车。

解释一下:

  • 您正在混合 Angular 和 jquery。它不是被禁止的,但它并没有真正添加任何东西,并且可能会使事情变得复杂。他们对于如何操纵 View 有不同的策略。

  • Angular 具有双向绑定(bind)。文件准备好后,您无需聆听。这是 jquery 代码。 Angular 会自动为您更新范围和 View 。

  • 在 angularJS 中使用此关键字可能会导致一些范围问题,请使用 $scope 代替。

  • 您正在使用 jquery 的 $.getJSON 获取数据。您可以改用 Angular $http 组件。

我用工作示例制作了一个plunker:https://plnkr.co/edit/1xqvFVTed9I7lJj9NkFH?p=preview

var app = angular.module('fhu', []);

app.controller('FhuController', function($scope, CarService) {
    $scope.selectedCar;

    CarService.getCars().then(function(listOfCars) {
      console.log(listOfCars);
      $scope.carList = listOfCars;
    });

    $scope.changedValue = function() {
      alert('You just selected '+ $scope.selectedCar.licence);
    }              
});

app.factory('CarService', function($http) {

  const getCars = function() {
    return $http.get('https://www.rantakallio.fi/fillherup/fillingapi.php?action=get_cars');
  };

  return { getCars };
});

让我们看一下代码:

  1. 我删除了函数包装。
  2. 我删除了 jquery document.ready
  3. 我删除了 jquery .getJson 并使用了 Angular 的 $http 组件,它做了同样的事情。
  4. 我为您的 http 请求提供了服务。它基本上将请求包装在工厂/服务中,您可以将其注入(inject)代码中的任何位置。因此,如果有另一个 Controller 需要获取汽车列表。您可以注入(inject) CarService

查看 CarService.getCars() 行。 getCars 是名为 CarService 的工厂中的一个函数。我让它返回一个简单的 promise ,您需要使用 $http 组件(已注释掉)。

我只是返回 promise 并将其在 Controller 中解开并将值放入我的 carList 变量中。当 Angular 发现变量发生变化时,它会为你更新 View 。当您从选择列表中进行选择时,也会发生同样的情况。因为您将 ng-model="selectedCar"放入 View 中,所以 Angular 将为您更新模型。因此,您可以在 Controller 中使用它来执行某些操作。

在代码示例中,您可以看到不需要将值传递到函数中。您只需阅读 $scope.selectedCar

关于javascript - 如何实现下拉列表更改事件捕获功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45387301/

相关文章:

node.js - 在Windows 7上安装Ionic Framework时出错

css - 将新行/n 转换为 Angular 换行符

reactjs - 存储下拉选择并从 localStorage 加载它

java - 在java中的3个下拉列表中传递值

javascript - www 和非 www 的 Nodejs session 问题

javascript - AngularJS可关闭的div点击后不关闭

javascript - AngularJS 中的 Spotify 网络播放器风格 UI

javascript - 为什么我的 javascript 代码没有激活该功能?

javascript - 如何在自定义 Angular Directive(指令)上添加/设置验证器(必需的、原始的等)

php - 如何将 PHP 输出插入 html div 替换临时图形