2014-11-15 42 views
1

我在使用ngTagsInput時遇到綁定對<autocomplete source='fnPromise()'>的承諾的問題。我認爲ngTagsInput沒有任何問題;我認爲我不瞭解範圍和承諾,足以理解如何去做我想做的事情。

我設置的指令正常:

<tags-input ng-model="token.ids.tags" 
      class="form-field no-animate tag-input" 
      placeholder="Delete unwanted IDs" 
      addFromAutocompleteOnly="true"> 
    <auto-complete source="offerTags($query)"></auto-complete> 
</tags-input> 

問題在於offerTags()函數。這將返回一個承諾,而是因爲我想填充這是此控制器的$範圍的一部分陣列自動完成的,我告訴許剛返回$ scope屬性:

$scope.offerTags=function(query) { 
    var deferred=$q.defer(); 

    var tags=$scope.token.ids.tags; 
    deferred.resolve(tags); 
    return deferred.promise; 
} 

然而,$ scope.token.ids .tags僅在服務返回後(在頁面加載後)纔會填充。所以會發生的是,offerTags總是返回一個空數組。該承諾不會更新token.ids.tags服務的新值。

編輯:Plunkr demonstrating problem

也就是說,如果你有一個靜態數組,然後自動完成功能的作品,但只有靜態數組的內容替換$ scope.token.ids.tags。

對不起,很長的解釋...任何想法如何我可以得到這個工作?

+0

我們可以看到服務?它回覆了一個承諾嗎? –

+0

'offerTags'(上面引用的)是返回承諾的服務。 '$ scope.token.ids.tags'在各個地方被更新爲$ http請求的回調。 – metalaureate

+0

我猜ngTagsInput在這裏是一個紅鯡魚 - 問題是這個承諾沒有反映$ scope的變化值。 – metalaureate

回答

1

您的服務應該類似於此:

app.factory('TokenService', function ($http) { 
    return { 
     loadTags: function (query) { 
      return $http.get('/query', { 
      params: { 
      q: query 
      } 
      }).then(function(res){ 
      return res.data; 
      }); 
     } 
    } 
}); 

把它放在範圍:

$scope.loadTags = TokenService.loadTags; 

而且模板:

<tags-input ng-model="tags"> 
    <auto-complete source="loadTags($query)"></auto-complete> 
</tags-input>