如何在 Angular 1.5 中使用 HTML 选择调用父组件

Posted

技术标签:

【中文标题】如何在 Angular 1.5 中使用 HTML 选择调用父组件【英文标题】:How to invoke parent component with HTML select in Angular 1.5 【发布时间】:2016-10-23 15:50:30 【问题描述】:

我有一个向子组件输入项目的根组件:

angular.module('demoApp', ['listing'])
.component('smartComponent', 
  templateUrl: 'smartComponent.template.html',
    controller: function() 
      var self = this;

      self.items = [
        id: 1,
        text: 'item1'
      , 
        id: 2,
        text: 'item2'
      ];

      self.selectItem = function(item) 
        console.log('Selected item: ' + JSON.stringify(item));  
      ;

    
)

子组件的项目是单向绑定的:

angular.module('listing', [])
.component('listing', 
  templateUrl: 'listing.template.html',
  bindings: 
    items: '<',
    onSelect: '&'
  

);

我可以轻松处理点击以选择带有ng-click 的项目。但我不确定如何处理select 下拉菜单。

<div class="form-group">
<select id="test" class="form-control" ng-change="$ctrl.onSelect(item: item)" ng-model="$ctrl.itemId" ng-options="item.id as item.text for item in $ctrl.items track by item.id" required>
    <option value="">---Please select---</option>
</select>

这是一个可以工作的 ng-click 和不工作的选择:http://plnkr.co/edit/lQAhsqvsyjwCRhvkhSuS?p=preview

如何使用select 将项目传递给父组件?谢谢!

【问题讨论】:

【参考方案1】:

通过从您的 plunk 中更改 listing.template.html 中的 ng-optionsng-model 值,我能够获得您使用 ng-click 获得的结果。

你有这个:

  <select id="test" 
          class="form-control" 
          ng-change="$ctrl.onSelect(item: item)" 
          ng-model="$ctrl.itemId" 
          ng-options="item.id as item.text for item in $ctrl.items track by item.id" 
          required>

我把它改成这个来让它工作:

  <select id="test" 
          class="form-control" 
          ng-change="$ctrl.onSelect(item: $ctrl.item)" 
          ng-model="$ctrl.item" 
          ng-options="item.text for item in $ctrl.items" 
          required>

item 实际上不是 $scope 上可用的值,因为它只能在 option 子级中可用。但是,如果您对ng-model 使用与传递给onSelect 的参数相同的值,则所选值将对您可用。我知道我删除了很多您在 ng-options 中使用的子句,但希望这能让您重回正轨。

【讨论】:

以上是关于如何在 Angular 1.5 中使用 HTML 选择调用父组件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 1.5 组件中使用绑定

在 Angular 1.5 中,如何从子组件编译父组件的 html?

如何在 Angular 1.5 中为同一组件使用不同的模板 url

Angular 1.5 通过使用另一个组件在函数中返回 html 结果

如何在 Angular 1.5 中将 Angular 组件与 ui.bootstrap.modal 一起使用?

如何在 Angular 1.5 组件中使用多槽透入,或者改用啥?