我有一个案例,我将一个属性传递给包裹在mut
助手中的子组件。然后我在子组件中更新此值,并使用闭包操作将操作发送到父组件。
然后,如果我使用get
在父组件中读取此值,则会得到正确的值。但是,如果我将此属性传递给模板中的操作,则不会更新值。
我提供Ember-Twiddle来说明此问题(请查看console.log
)。
我在这个解决方案中遗漏了什么?还是按预期工作?请查看onInnerUp
控制器中的index
操作,了解我要做的事情。
我知道这是一个非常凌乱的描述,希望有人能理解我在努力的是什么
答案 0 :(得分:2)
它按预期工作。这就是为什么?
当模板index.hbs
在某个时刻呈现时,它会通过动作助手创建一个动作,并将当前值分配给controllerVal
。在你的情况下;在初始渲染之后,该值为0.
只有在重新渲染模板后才会重新创建操作。在你的旋转中,你不是在等待模板重新渲染并立即触发动作(已经使用之前的controllerVal
值创建了动作)。即使在controllerVal
内value
增加时,my-component.js
会自动增加(由于双向绑定);该动作尚未重新创建并保留以前的值;因此,您获得的分配给controllerVal
的previus值作为您的操作的参数。我希望我能够以一种简单的方式解释发生了什么。
事实上勒克斯已在上述评论中解释了克服这种情况的方法;但是我为你创建了一个修改过的twiddle。在这个旋风中,我没有立即触发行动;但是延迟它直到下一次渲染通过Ember.run.scheduleOnce(queue, target, method)
完成。我使用afterRender
队列来等待重新呈现模板。如果您愿意,可以进一步查看Ember运行循环。我猜This可能是一个很好的起点。我最诚挚的问候。