2015-05-05 86 views
0

我更像是一個後端的傢伙,試圖讓它進入前端,特別是Ember。我已經創建了一個API,現在我試圖創建幾乎像自動完成搜索(類似於Angulars filter | ngModel)。這裏是我的API:過濾一個餘燼模型

{ 
    data: [ 
    { 
     id: 6, 
     name: "Alexandrine Skiles", 
     links: [ 
     { 
      rel: "self", 
      uri: "/api/v1/address-book/alexandrine-skiles" 
     } 
     ] 
    }, 
    { 
     id: 33, 
     name: "Ally Johns", 
     links: [ 
     { 
      rel: "self", 
      uri: "/api/v1/address-book/ally-johns" 
     } 
     ] 
    } 
    ] 
} 

這裏是我的路線:

export default Ember.Route.extend({ 
    model: function(){ 
     var adapter = AddressBookAdapter.create(); 
     var companies = adapter.findAll(); 
     return companies; 
    } 
}); 

這裏是適配器:

export default Ember.Object.extend({ 
    findAll: function(){ 
     return ajax('http://localhost:8000/api/v1/address-book/companies') 
      .then(function(response){ 
       return response.data; 
      }); 
    } 
}); 

這裏是控制器:

export default Ember.ArrayController.extend({ 
    searchKeyword: null, 

    searchResults: function(){ 
     var searchText = this.get('searchText'); 

     if(! searchText) return; 

     var adapter = AddressBookAdapter.create(); 
     var companies = adapter.findAll(); 

     var regex = new RegExp(searchText, 'i'); 

     return companies.then(function(data){ 
      return data.filter(function(company){ 
       return company.name.match(regex); 
      }); 
     }); 
    }.property('searchText') 
}); 

這裏是html:

{{input type="text" value=searchText class="form-control" id="inputContactSearch" }} 

{{#if searchResults}} 
     {{#each searchResult in searchResults}} 
      <tr> 
       <td>{{searchRe}}</td> 
      </tr> 
     {{/each}} 
{{else}} 
     {{#each m in model}} 
      <tr> 
       <td><a href="{{m.links.uri}}">{{m.name}}</a></td> 
      </tr> 
     {{/each}} 
{{/if}}   

現在我知道我的手柄條的設置方式並不是If和Else語句中最好的。我只是想讓它工作我覺得我非常接近我得到的錯誤,每個循環需要是一個數組而不是對象。但是Model不是一個對象而是數組,但它仍然可以正確地循環它。這是這種方式去解決這個問題,或者我是完全錯誤的。是否只有像Angular這樣的直線模型過濾器,或者這種方式仍然可行。在此先感謝

+0

您是否停用了[原型擴展名]的(http://guides.emberjs.com/v1.10.0/configuring-ember/disabling-prototype-extensions/)? – MilkyWayJoe

+0

@MilkyWayJoe我不確定這到底意味着什麼 – ThreeAccents

+0

如果你在控制檯輸入'Ember.EXTEND_PROTOTYPES',結果是'true'還是'false'? – MilkyWayJoe

回答

0

所以問題是,你試圖迭代的承諾,而不是承諾的解決價值。要清楚的是,適配器返回一個承諾,並在您的計算屬性中,您將返回相同的承諾。當承諾解決時,它不會成爲解決的價值。它執行成功或失敗的功能。這取決於你適當地分配這個值。

更改您的控制器以使用從路徑的模型鉤子返回的模型。這個鉤子阻止承諾,所以你的控制器模型的價值是公司。

export default Ember.ArrayController.extend({ 
    searchKeyword: null, 

    searchResults: function(){ 
     var searchText = this.get('searchText'); 

     if(! searchText) return; 

     //YOUVE ALREADY GOT THE COMPANIES DONT GO BACK TO THE SERVICE 
     var companies = this.get('model'); 

     var regex = new RegExp(searchText, 'i'); 

     return companies.filter(function(company){ 
      return company.name.match(regex); 
     }); 
    }.property('searchText', 'model') 
}); 
+0

你是老闆!謝謝 – ThreeAccents