Oi,
O corpo docente do Ember.SortableMixin é integrado ao controlador Array.
Isso nos dá uma maneira de usar 2 propriedades para controlar a atividade do mecanismo de classificação na propriedade ‘content’.
App.GoodiesController = Ember.ArrayController.extend
sortProperties:["name"]
sortAscending: true
Neste ponto – a propriedade ‘content’ ou ‘model’ agora é classificada de acordo com o ArrayController
e se você estiver fazendo um loop em #each sem nenhum argumento, obterá os benefícios imediatamente.
Mas e se você precisar usar o conteúdo classificado como entrada em outro mecanismo – por exemplo, resultados de pesquisa?
Digamos que você configurou um campo de pesquisa denominado ‘searchText’ no modelo de padaria
e está usando o padrão do observador para obter acesso ao campo e, em seguida, filtrar com base
no searchText.
A propriedade searchResults é o que iremos iterar em vez de ‘modelo’ ou ‘conteúdo’
<script type="text/x-handlebars" id="bakery">
At {{#link-to 'goodies' name}}"{{name}}" {{/link-to}}
<br/>
{{input type='text' value=searchText}}
<!-- outlet is where goodies will appear (render) -->
{{outlet}}
</script>
<script type="text/x-handlebars" id="goodies">
You see the following goodies:
<ul>
{{#each item in searchResults}}
<li>{{item.name}}</li>
{{/each}}
</ul>
</script>
Você configurou seu controlador para precisar do texto searchText da padaria e está observando as alterações
nele – bem como filtrando os resultados de ‘conteúdo’ em ‘searchResults’
searchResults começa como uma propriedade computada defaultingTo ‘content’
App.GoodiesController = Ember.ArrayController.extend({
sortProperties:["name"],
sortAscending: true,
needs: "bakery",
searchResults: Ember.computed.defaultTo("content"),
filterItem: function (model) {
searchInput = this.get('controllers.bakery.searchText')
regexp = new RegExp(searchInput, "i");
if(!searchInput || (searchInput && (0 == searchInput.length))) {
return true
} else if (-1 != model.name.search(regexp)) {
return true
} else {
return false
}
},
searchFilter: function() {
searchInput = this.get('controllers.bakery.searchText')
Ember.Logger.debug("someone is looking for " + this.get("controllers.bakery.searchText"))
this.set('searchResults',this.get('content').filter(this.filterItem.bind(this)))
}.observes("controllers.bakery.searchText"),
})
Isso lhe dá a capacidade de filtrar por resultados … mas agora a classificação não está funcionando.
É aqui que a propriedade ‘disabledContent’ de Ember.SortableMixin se torna útil.
alterando duas linhas para usar ‘disabledContent’ em vez de ‘content’, você acaba pesquisando e classificando
App.GoodiesController = Ember.ArrayController.extend({
sortProperties:["name"],
sortAscending: true,
needs: "bakery",
// search on the sorted
searchResults: Ember.computed.defaultTo("arrangedContent"),
filterItem: function (model) {
searchInput = this.get('controllers.bakery.searchText')
regexp = new RegExp(searchInput, "i");
if(!searchInput || (searchInput && (0 == searchInput.length))) {
return true
} else if (-1 != model.name.search(regexp)) {
return true
} else {
return false
}
},
searchFilter: function() {
searchInput = this.get('controllers.bakery.searchText')
Ember.Logger.debug("someone is looking for " + this.get("controllers.bakery.searchText"))
// search on the sorted
this.set('searchResults',this.get('arrangedContent').filter(this.filterItem.bind(this)))
}.observes("controllers.bakery.searchText"),
})
Aí está – encadear a classificação e a pesquisa juntas.