調査の日の後、クロールを防止する2つの問題が見つかりました。
1.入力検証コンポーネント。
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}`));
}
});
このコンポーネントを新しいものに置き換えました。コードの
2.この作品(私はパフォーマンス最適化のためにそれを書いた):
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')
私は、これら二つの事を固定し、今私のアプリをレンダリングすることができボットをグーグル。
残念ながら、環境の制約からFastBootを使用することはできません。実際には、クローラのサーバーレンダリングを提供するさまざまなオンラインサービスを見てきましたが、突然これを見ました:http://discuss.emberjs.com/t/how-to-build-a-sitemap/10655/6。だから私は、Googleのクローラが私のアプリケーションのインデックスを作成するかもしれないという結論を出しました。 – Crabar