1
  • 角1.5.8
  • 引導3.3.7(CSS)
  • 角的UI 2.0.2

使用角度預輸入(ui.bootstrap.typeahead)需要的對象的列表其將在UI組件與HTMLtyphead不填充角UI

問題顯示

  1. 從服務返回promise組分(1.5式控制器,視圖綁定

  2. 控制器功能使用從服務返回的promise並執行then邏輯並返回對象的array

  3. Typeahead不處理數組...執行控制檯日誌,您可以看到數組。

  4. 如果我使用服務方法然後該功能可以運行靜態傳遞對象的相同陣列,而不

HTML

  <input type="text" ng-model="$ctrl.search.term" ng-disabled="!$ctrl.search.type" 
        typeahead-wait-ms="600" 
        placeholder="Search..." 
        uib-typeahead="res as res.name for res in $ctrl.submit($viewValue)" 
        typeahead-no-results="noResults" class="form-control" required> 
      <i ng-show="loadingLocations" class="icon ion-refresh"></i> 

      <div ng-show="noResults"> 
       <i class="icon ion-close"></i> No Results Found 
      </div> 

      <select class="form-control custom-select-md" 
        ng-model="$ctrl.search.type" 
        placeholder="Type" 
        required> 
       <option value="" disabled selected>Select Type?</option> 
       <option value="car">car</option> 
       <option value="van">van</option> 
      </select> 

組分(控制器,視圖)

//submit search for issuers or issuedCard 
submit() { 
    this.isSubmitting = true; 

    this._SearchService.performSearch(this.search) 
    .then(
     (resp) => { 
      //e.g. [{id:1, name:'test'}] 
      console.log('Search Result', resp); 
      return resp;         
     }, 

     (err) => { 
      console.log('Error Search', err); 
      this.reset(false); 
      this.errors = err; 
      return []; 
     } 
    ); 

    //Comment out method above to see this static data returning and working as should be :'(
    //return [{id:865,issuer: {},name:"British Testing"}, 
    // {id:866,issuer: {},name:"American Testing"}]; 
} 

服務

performSearch(searchData) { 
    console.log('Search Qry', searchData); 

    let deferred = this._$q.defer(); 

    if(!this.isValidSearch(searchData)) { 
     deferred.reject({status:400, error: 'Bad Request', message:'invalid data'}); 
     return deferred.promise; 
    } 

    let searchURI = (searchData.type === 'car' ? 'van' : 'issuer'); 

    this._$http({ 
     url: `${this._AppConstants.api}/${this._AppConstants[searchURI]['search']}`, 
     method: 'GET', 
     params: { 
      name: searchData.term 
     } 
    }).then(
     (resp) => { 
      console.log('Search Data', resp); 
      this.result.term = searchData.term; 
      this.result.type = searchURI; 
      deferred.resolve(resp.data[this._AppConstants[searchURI]['searchResp']]); 

     }, 

     (err) => { 
      console.log('Error performing search', err); 
      deferred.reject(err.data); 
     } 
    ); 

    return deferred.promise; 
} 

回答

0

您使用

res as res.name for res in $ctrl.submit($viewValue) 

in之後是什麼應該是一個數組或數組的一個承諾。

但事實並非如此。這是$ctrl.submit()返回的結果。而這個方法不返回任何東西:

submit() { 
    this.isSubmitting = true; 

    // no return here 

    this._SearchService.performSearch(this.search) 
    .then(
     (resp) => { 
      //e.g. [{id:1, name:'test'}] 
      console.log('Search Result', resp); 
      return resp;         
     }, 

     (err) => { 
      console.log('Error Search', err); 
      this.reset(false); 
      this.errors = err; 
      return []; 
     } 
    ); 

    // no return here 
} 

唯一return語句從傳遞給then()函數返回,並執行異步,該submit()方法沒有返回後(即undefined)。

所以,要短,你需要返回的承諾:

return this._SearchService.performSearch(this.search) ... 

需要注意的是,如果你使用的承諾鏈接您的服務方法可以減少和清潔,而不是解決/拒絕反模式:

performSearch(searchData) { 
    console.log('Search Qry', searchData); 

    if(!this.isValidSearch(searchData)) { 
     return $q.reject({status:400, error: 'Bad Request', message:'invalid data'}); 
    } 

    let searchURI = (searchData.type === 'car' ? 'van' : 'issuer'); 
    return this._$http.get(`${this._AppConstants.api}/${this._AppConstants[searchURI]['search']}`, { params: {name: searchData.term) } }).then(
     resp => { 
      console.log('Search Data', resp); 
      this.result.term = searchData.term; 
      this.result.type = searchURI; 
      return resp.data[this._AppConstants[searchURI]['searchResp']]); 
     }).catch(resp => { 
      console.log('Error Search', err); 
      this.reset(false); 
      this.errors = err; 
      return $q.reject([]); 
     }); 
} 
+0

感謝您的回覆:)我不認爲你已經理解了返回的內容?我可以在控制檯中看到完美無瑕,控制器中有一組對象正在接收,並返回到視圖。 [示例截圖](http://imgur.com/a/ltQG4)。 Service返回promise'deferred.promise',這是API結果,是一個對象數組''{id:1,name:'testing'},{id:2,name:'testing 2'}]'' 。控制器通過'then'成功/錯誤處理程序接收到這個承諾和進程(省略了一些進一步處理冗長的目的),並將數組返回到視圖 – RRR

+0

不。它不返回數組。重新閱讀我的答案。傳遞給then()的回調函數返回一個數組。但是submit()方法不會返回任何東西。它不可能返回一個數組,因爲該數組是異步獲得的**,使用promise。所以它可以(也應該)返回一個數組的承諾,但它不會:它什麼都不返回。如果是這樣,你的打字機就可以正常工作,而且你不會問你的問題。僅僅因爲數組打印在函數的代碼中並不意味着該數組是從函數返回的。這是兩個完全不同的東西。 –

+0

也許我不理解:/ ...感謝您的時間,非常感謝!我是一個Java/Groovy的傢伙......哈哈......還在圍繞着JS。我簡單地將回報添加到服務方法的控制器上,並且工作正常......但我的頭腦卻不明白爲什麼。你提到提交不會返回任何內容......爲什麼我沒有從當時的錯誤或成功處理程序中返回的事實計數?無法相信我在這個愚蠢的問題上花了多少時間:/ – RRR