如何在 Ember 组件中触发 didReceiveAttrs
How to trigger didReceiveAttrs in Ember component
使用版本 2.17。我在带有控制器的 /edit
路由中有一个 Ember 组件:
// edit.hbs
{{ingredient-table recipe=model ingredients=model.ingredients}}
在我的组件中,我使用 didRecieveAttrs
钩子在渲染时循环 ingredients
,基于每个对象创建代理对象,然后使用这些对象构建成分 table代理对象。
// ingredient-table.js
didReceiveAttrs() {
let uniqueIngredients = {};
this.get('ingredients').forEach((ingredient) => {
// do some stuff
})
this.set('recipeIngredients', Object.values(uniqueIngredients));
}
我还有一个 delete
操作,当用户希望删除成分 table 中的一行时,我会调用该操作。我的 delete
操作如下所示:
// ingredient-table.js
deleteIngredient(ingredient) {
ingredient.deleteRecord();
ingredient.save().then(() => {
// yay! deleted!
})
}
上面提到的一切都工作正常。问题是删除的成分行保留在 table 中,直到页面刷新。它应该在用户删除后立即消失,无需刷新页面。我需要再次触发 didReceiveAttrs
挂钩。如果我手动调用那个钩子,我所有的问题都解决了。但我认为我不应该手动调用它。
根据文档,据我所知,此挂钩将在页面加载和重新呈现(未在内部启动)时再次触发。我想我在弄清楚这意味着什么时遇到了一些麻烦。这是我尝试过的:
1) 在 ingredient-table.js
中我的 save
的承诺处理程序中调用 ingredients.reload()
(我在这里也试过 recipe.reload()
)。
2) 创建一个调用 model.ingredients.reload()
的控制器函数,并将其传递到我的组件,然后在承诺处理程序中调用它。 (我这里也试过model.reload()
)。
都没用。我什至使用正确的钩子吗?
我想 recipeIngredients
是 table 中列出的项目。如果是这样的话;请删除 didReceiveAttrs
钩子中的代码,并在组件中将 recipeIngredients
计算为 属性。让代码说话:
// ingredient-table.js
recipeIngredients: Ember.computed('ingredients.[]', function() {
let uniqueIngredients = {};
this.get('ingredients').forEach((ingredient) => {
// do some stuff
})
return Object.values(uniqueIngredients)
})
我的猜测是didReceiveAttrs
hook 没有再次触发;因为传递给组件的数组 ingredients
没有改变;所以 attrs
没有改变。顺便一提;尽可能依赖 Ember 的计算属性;他们是 Ember 设计的核心。
使用版本 2.17。我在带有控制器的 /edit
路由中有一个 Ember 组件:
// edit.hbs
{{ingredient-table recipe=model ingredients=model.ingredients}}
在我的组件中,我使用 didRecieveAttrs
钩子在渲染时循环 ingredients
,基于每个对象创建代理对象,然后使用这些对象构建成分 table代理对象。
// ingredient-table.js
didReceiveAttrs() {
let uniqueIngredients = {};
this.get('ingredients').forEach((ingredient) => {
// do some stuff
})
this.set('recipeIngredients', Object.values(uniqueIngredients));
}
我还有一个 delete
操作,当用户希望删除成分 table 中的一行时,我会调用该操作。我的 delete
操作如下所示:
// ingredient-table.js
deleteIngredient(ingredient) {
ingredient.deleteRecord();
ingredient.save().then(() => {
// yay! deleted!
})
}
上面提到的一切都工作正常。问题是删除的成分行保留在 table 中,直到页面刷新。它应该在用户删除后立即消失,无需刷新页面。我需要再次触发 didReceiveAttrs
挂钩。如果我手动调用那个钩子,我所有的问题都解决了。但我认为我不应该手动调用它。
根据文档,据我所知,此挂钩将在页面加载和重新呈现(未在内部启动)时再次触发。我想我在弄清楚这意味着什么时遇到了一些麻烦。这是我尝试过的:
1) 在 ingredient-table.js
中我的 save
的承诺处理程序中调用 ingredients.reload()
(我在这里也试过 recipe.reload()
)。
2) 创建一个调用 model.ingredients.reload()
的控制器函数,并将其传递到我的组件,然后在承诺处理程序中调用它。 (我这里也试过model.reload()
)。
都没用。我什至使用正确的钩子吗?
我想 recipeIngredients
是 table 中列出的项目。如果是这样的话;请删除 didReceiveAttrs
钩子中的代码,并在组件中将 recipeIngredients
计算为 属性。让代码说话:
// ingredient-table.js
recipeIngredients: Ember.computed('ingredients.[]', function() {
let uniqueIngredients = {};
this.get('ingredients').forEach((ingredient) => {
// do some stuff
})
return Object.values(uniqueIngredients)
})
我的猜测是didReceiveAttrs
hook 没有再次触发;因为传递给组件的数组 ingredients
没有改变;所以 attrs
没有改变。顺便一提;尽可能依赖 Ember 的计算属性;他们是 Ember 设计的核心。