Nach einem Tag der Untersuchung fand ich zwei Probleme, die Crawling verhindert.
1. Eingabe-Validierungskomponente.
import Ember from 'ember';
const {
computed,
observer,
defineProperty,
run
} = Ember;
export default Ember.Component.extend({
classNames: ['form-group', 'has-feedback', 'validated-input'],
classNameBindings: ['isValid:has-success', 'showErrorClass:has-error'],
isValid: false,
model: null,
value: null,
rawInputValue: null,
type: 'text',
valuePath: '',
placeholder: '',
attributeValidation: null,
isTyping: false,
didValidate: computed.oneWay('targetObject.didValidate'),
showErrorClass: computed('isTyping', 'showMessage', 'hasContent', 'attributeValidation', function() {
return this.get('attributeValidation') && !this.get('isTyping') && this.get('showMessage');
}),
hasContent: computed.notEmpty('rawInputValue'),
isValid: computed.and('hasContent', 'attributeValidation.isValid'),
isInvalid: computed.oneWay('attributeValidation.isInvalid'),
inputValueChange: observer('rawInputValue', function() {
this.set('isTyping', true);
run.debounce(this, this.setValue, 500, false);
}),
showMessage: computed('attributeValidation.isDirty', 'isInvalid', 'didValidate', function() {
return (this.get('attributeValidation.isDirty') || this.get('didValidate')) && this.get('isInvalid');
}),
setValue() {
this.set('value', this.get('rawInputValue'));
this.set('isTyping', false);
},
init() {
this._super(...arguments);
var valuePath = this.get('valuePath');
defineProperty(this, 'attributeValidation', computed.oneWay(`model.validations.attrs.${valuePath}`));
this.set('rawInputValue', this.get(`model.${valuePath}`));
defineProperty(this, 'value', computed.alias(`model.${valuePath}`));
}
});
Ich ersetzte diese Komponente durch neuere.
2.Dieser Stück Code (Ich schrieb es für Performance-Optimierung):
ingredients: function() {
var self = this;
return DS.PromiseArray.create({
promise: new Promise((resolve, reject) => {
let loadedIngredients = self.store.peekAll('ingredient');
if (loadedIngredients && loadedIngredients.get('length') > 0) {
let mappedIngredients = self.get('recipe').get('ingredientsWithQuantities').map(function(item) {
return {
name: self.store.peekRecord('ingredient', item.ingredientId).get('name'),
quantity: item.quantity
};
});
resolve(mappedIngredients);
} else {
this.store.findAll('ingredient').then(function() {
let mappedIngredients = self.get('recipe').get('ingredientsWithQuantities').map(function(item) {
return {
name: self.store.peekRecord('ingredient', item.ingredientId).get('name'),
quantity: item.quantity
};
});
resolve(mappedIngredients);
})
}
})
});
}.property('recipe.ingredientsWithQuantities')
ich diese beide Sache festgelegt und jetzt Google bietet die Lage, meine app zu machen.
Leider kann ich FastBoot aufgrund von Umgebungseinschränkungen nicht verwenden. Eigentlich habe ich mir schon verschiedene Online-Dienste angeschaut, die Server-Rendering für Crawler anbieten, aber plötzlich sah ich das: http://discuss.emberjs.com/t/how-to-build-a-sitemap/10655/6. Also habe ich festgestellt, dass Google Crawler meine App indexieren könnte. – Crabar