2016-04-19 3 views
1

у меня есть следующий фильтр:Угловое обслуживание фильтра с обещанием

app.filter("findDivision", function(divisionService) { 

    var isWaiting = false; 
    var returnValue = null; 

    function myFilter(input) { 

     var translationValue = "Loading..."; 
     if(returnValue) 
     { 
      translationValue = returnValue; 
     } else { 
      if(isWaiting === false) { 
       isWaiting = true; 
       divisionService.getDivisionById(input).then(function(data) { 
        console.log("GetTranslation done"); 
        returnValue = data[0].name; 
        isWaiting = false; 
       }); 
      } 
     } 

     return translationValue; 
    } 

    return myFilter; 
}); 

Если функция я заехать в divisionService выглядит следующим образом:

getDivisionById: function (id) { 
    var d = $q.defer(); 
    $http({ 
     url: api.getUrl2('division'), 
     method: "GET", 
     params: {filters: {id: {EQUAL: id}}} 
    }).success(function (data, status, headers, config) { 
     d.resolve(data); 
    }).error(function (data, status, headers, config) { 
     api.handleError(data); 
     console.log(data); 
     d.reject(data); 
    }); 
    return d.promise 
} 

К сожалению, выход из этого выглядит следующим образом:

enter image description here

Может ли кто-нибудь сказать мне, почему это happe нин? и как я могу получить правильное значение?

+0

Фильтры должны быть синхронными, вы не можете использовать асинхронную службу. – dfsq

+1

Вы можете заставить его работать, хотя в этом случае вам нужен фильтр с состоянием: https://code.angularjs.org/1.3.7/docs/guide/filter. В вашем случае просто добавьте одну строку перед возвратом 'myFilter. $ Stateful = правда, '. – dfsq

ответ

1

При первых вызовах фильтра обещание, вероятно, еще не разрешено, поскольку для завершения HTTP-вызова требуется некоторое время. Ваш код фильтра немедленно перейдет к оператору возврата return translationValue;. В этом случае фильтр возвращает «Загрузка ...».

К сожалению, фильтр не будет автоматически переоценивать фильтр до следующего цикла дайджест. Угловой не знает, что он должен сделать еще один цикл дайджеста, потому что ничего не меняется (нет взаимодействия с пользователем или изменений в $ scope). В качестве эксперимента попробуйте вручную запустить цикл дайджеста, изменив модель, например. используя коробку input с ng-model. В этот момент вы увидите, что фильтр будет переоцениваться, и будет отображаться выход.

+0

Могу ли я создать директиву, а затем использовать эту службу и обновить текст –

Смежные вопросы