Angularjs函数调用命令

时间:2017-02-07 09:07:05

标签: javascript angularjs

我有一个选项下拉列表,根据条件显示或不显示。

   <div class="col-sm-9">
      <select class="form-control" ng-model="vm.templateType" ng-disabled="vm.status == 'sold' || vm.status == 'return' "ng-options="type.id as type.name for type in vm.templateTypes | filter:vm.isShowableTemplate"></select>
 </div>

这是我的控制器:

function FormOrderDialogController(tsModulesService, $scope, $q, $http, $uibModalInstance, params, $filter, Requester)                              

    Requester.restGet("/events/" + params.eventId, null, params.serverId).then((data)=>{
        vm.event = data;
    });

    Requester.restGet('/dic/10', null, null, null, true).then((resp) => {
        vm.templateTypes = resp;
        vm.templateType = vm.templateTypes[0].id;
    });    

     vm.isShowableTemplate = isShowableTemplate;

     function isShowableTemplate(templateType) {

        switch (templateType.id) {
            case 321:
                return !!vm.event.info.ticketTemplate;
            case 322:
                return !!vm.event.info.ticketETemplate;
        }
    }                                                                           

当isShowableTemplate被调用时,我希望事件对象被填充,并且事情是getEvent函数被调用两次,一次是在isShowableTemplate之前调用,一次之后。问题是第一次通话后事件未定义,我收到错误&#34;无法读取属性&#39; info&#39;未定义&#34;。 我的问题是为什么会这样,我做错了什么。我是js和angular的新手,所以我可能会错过一些必要的东西。

1 个答案:

答案 0 :(得分:1)

为什么不删除功能和过滤器:

function FormOrderDialogController(tsModulesService, $scope, $q, $http, $uibModalInstance, params, $filter, Requester)                              

    Requester.restGet("/events/" + params.eventId, null, params.serverId)
        .then(data => {
            vm.event = data;

            return Requester.restGet('/dic/10', null, null, null, true);
        })
        .then(resp => {
            vm.templateTypes = resp;
            vm.showableTemplateTypes = resp.filter(t => { 
                switch (t.id) {
                    case 321:
                        return !!vm.event.info.ticketTemplate;
                    case 322:
                        return !!vm.event.info.ticketTemplate;
                }

                return false; // or true depending if you want to show the     others.
            });

            vm.templateType = vm.templateTypes[0].id;
        });   
}  

我已将两个Promise组合在一起,因为您在第二个响应中使用了vm.event。通过这种方式,您可以始终保证vm.event的某些价值。

html:

<div class="col-sm-9">
    <select class="form-control" ng-model="vm.templateType" ng-disabled="vm.status == 'sold' || vm.status == 'return' "ng-options="type.id as type.name for type in vm.showableTemplateTypes"></select>
</div>