2015-05-05 25 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