【问题标题】:Call a controller function in a component's templateUrl在组件的 templateUrl 中调用控制器函数
【发布时间】:2018-07-31 00:53:35
【问题描述】:

有没有办法在封装在 div 中的组件内调用控制器的函数,该组件已由该控制器运行?

组件:

angular
.module('myApp')
.component('taxiCard', {
    templateUrl: '/templates/taxi.html',
    bindings: { 
        taxi: '=' ,
        cancelTaxi: '='
    },
})

我要在模板中使用的控制器功能:

$scope.cancelTaxi = (taxi, id) => {
   console.log('cancelling..')
   taxi.available = true;
   taxi.history.unshift(cancel);
   dataFactory.updateTaxi(id, taxi).then(function(response){ 
   });
}

组件的templateUrl:

<md-card style="width: 300px;">
{{$ctrl.taxi._id}}
<md-button ng-show="$ctrl.taxi.available" ng-href="#!/taxies/rent/{{$ctrl.taxi._id}}">Najem</md-button> <!-- show if taxi.available -->
<md-button ng-hide="$ctrl.taxi.available" ng-click="$ctrl.cancelTaxi($ctrl.taxi, $ctrl.taxi._id)" type="submit">Preklici</md-button><!-- show if !taxi.available, torej cancel ce je rentan atm-->
<img ng-src="{{$ctrl.taxi.photo_url}}" class="md-card-image" alt="$ctrl.taxi.name" style="height:250px">
<md-card-title>
    <md-card-title-text>
    <span class="md-headline">{{$ctrl.taxi.name}}</span>
    </md-card-title-text>
</md-card-title>
<md-card-content>
    Leto izdelave: {{$ctrl.taxi.year}} <br>
    Max potnikov: {{$ctrl.taxi.max_p}} <br>
    Max hitrost: {{$ctrl.taxi.max_s}} <br>
</md-card-content>
<md-card-actions layout="row" layout-align="end center">
    <md-button ng-href="#!/taxies/details/{{$ctrl.taxi._id}}">Podrobnosti</md-button>
</md-card-actions>

我在哪里使用该组件:

<div class="md-padding" layout="row" ng-init="getTaxies()" layout-wrap>
<div ng-repeat="taxi in taxies">
    <a href="#!" ng-click="removeTaxi(taxi._id)">Delete</a>
    <taxi-card  taxi="taxi" 
                cancelTaxi="cancelTaxi">
    </taxi-card>   
</div>

澄清; cancelTaxi 是 TaxiesController 的一部分,它已经在我使用 . templateUrl 中的所有属性都显示正确,但我不知道如何获得取消出租车点击按钮工作的功能。

哦,是的,我在函数中做了一个 console.log,它甚至没有注册它......

感谢您的宝贵时间和意见!

【问题讨论】:

    标签: html angularjs controller angularjs-components angularjs-material


    【解决方案1】:

    这是因为组件的作用域是隔离的。你可以做两件事:


    将您的TaxiesController 转换为组件,并将require 转换为taxiCard

    .component('taxiCard', {
        templateUrl: '/templates/taxi.html',
        require: {
            TaxiesController: '^TaxiesController' // ^ will look for all parents
        }
        controllerAs: 'taxiCard'
    })
    

    html:

    <div ng-click="taxiCard.TaxiesController.cancelTaxi(taxi, id)"></div>
    

    或者将 TaxiesController 中的所有函数放在一个服务中,并将其作为依赖项添加到您的 taxiCard 组件中:

    .component('taxiCard', {
        templateUrl: '/templates/taxi.html',
        controllerAs: 'taxiCard',
        controller: function(taxiesService) {
            this.cancelTaxi = (taxi, id) => {
                taxiesService.cancelTaxi(taxi, id);
            }
        }
    })
    

    模板:

    <div ng-click="taxiCard.cancelTaxi(taxi, id)"></div>
    

    Protip:请使用controllerAs 语法,并尽量避免$scope

    【讨论】:

    • 感谢您的回答!我将尝试将控制器转换为组件。
    • 告诉我。几天前我遇到了同样的问题,并设法解决了它。所以我相信我可以帮助你。
    • 好的,我已经将函数放在服务中,并将它们添加为依赖项,但是仍然没有调用该函数(console.log 不显示任何内容)。这是编辑后代码的codepen:codepen.io/anon/pen/zRWVNY
    • 我刚刚删除了双向数据绑定:cancelTaxi: '=' 并且它开始工作了。请你解释一下为什么?
    • 啊,那是我的错误,我只是从您的示例中复制了它。我认为:通过绑定cancelTaxi,它创建了引用this.cancelTaxi。接下来,在您的控制器中,创建函数this.cancelTaxi。因此一个覆盖另一个。我认为绑定“获胜”,因此您的功能被覆盖/丢失。我认为您可以再次添加绑定,只需给您的函数起一个不同的名称,它们都可以工作。
    猜你喜欢
    • 2017-02-01
    • 2021-06-06
    • 1970-01-01
    • 2019-07-02
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多