由于超出了本问题范围的原因,我必须在模拟钩子中使用Ember。$。getJSON在我的 SearchRoute 中填充名为活动的Ember数据模型这样:
App.SearchRoute = Ember.Route.extend({
model: function (params) {
// Create a promise to return to the model hook. The promise will return a DS.RecordArray.
var modelPromise = new Ember.RSVP.Promise(function (resolve, reject) {
// Make the AJAX call to retrieve activities that match the search criteria
Ember.$.getJSON('/services/activities?query=' + params.q).then(function (data) {
data.activities.forEach(function (activity) {
// If the current activity does not already exist in the store...
if (!this.store.hasRecordForId('activity', activity.id)) {
// add the activity to the store
this.store.createRecord('activity', {
id: activity.id,
title: activity.propertyBag.title
});
}
}.bind(this));
resolve(this.store.all('activity', { query: params.q }));
}.bind(this));
}.bind(this));
// Return the DS.RecordArray as the model for the search route
return modelPromise;
}
});
然后,在我的 SearchController 中,我会在从绑定到显示结果的模板的计算属性返回结果之前进行一些模型排序和过滤,如下所示:
App.SearchController = Ember.ArrayController.extend({
filteredActivities: function () {
var model = this.get('model');
// complete various model sorting and filtering operations
return model;
}.property('model')
});
这是模板:
<script type="text/x-handlebars" data-template-name="activities">
{{#each item in filteredActivities}}
{{item.title}}
{{/each}}
</script>
每次执行搜索时,都会刷新 SearchRoute 中的模型挂钩,发出AJAX请求,并使用新的活动记录更新商店,如果必要。
问题是,即使我使用createRecord在商店中创建新记录并将新商店查询结果返回到我的模型钩子,filterActivities属性也不会被触发,模板也不会更新。
我认为,因为我将新更新的DS.RecordArray返回到模型钩子,Ember会认为我的模型已更改并触发任何计算属性,观察模型的更改,但我必须是遗失了什么。
有人有什么想法吗?
对于这篇长篇文章感到抱歉,非常感谢你花时间考虑我的问题!
答案 0 :(得分:0)
不要使用createRecord
。使用push
。
http://guides.emberjs.com/v1.10.0/models/pushing-records-into-the-store/
答案 1 :(得分:0)
您是否在计算属性model.[]
中尝试model.@each.propertyNameToObserve
或filteredActivities
?
@each的示例:http://guides.emberjs.com/v1.10.0/object-model/computed-properties-and-aggregate-data/,
http://guides.emberjs.com/v1.10.0/controllers/representing-multiple-models-with-arraycontroller/