观察以下演示:
(app.js)
App = Ember.Application.create();
App.Router.map(function() {});
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.Object.create({
value1: "A"
});
}
});
App.IndexController = Ember.Controller.extend({
actions: {
changeOutside: function () {
this.set("model.value1", "B");
}
}
});
App.TestTestComponent = Ember.Component.extend({
_value1: null,
value1: function (_, newValue) {
if (arguments.length > 1) {
this.set("_value1", newValue);
}
var res = "PREFIXED " + (this.get("_value1") || "");
return res;
}.property(),
actions: {
changeInside: function () {
this.set("value1", "C");
}
}
});
(index.hbs)
<h3>Inside controller</h3>
<button type="button" {{action "changeOutside"}}>Change</button>
1: {{model.value1}}<br/>
<hr />
{{test-test value1=model.value1}}
(成分/试验检验)
<h5>Inside component</h5>
<button type="button" {{action "changeInside"}}>Change</button>
1: {{value1}}<br/>
工作jsbin:http://emberjs.jsbin.com/zejujequco/1/edit?html,js,output
因此,我们的想法是拥有一个可以获取绑定属性并对其进行修改的组件。
正如你在小提琴中看到的那样,它不起作用。修改后的值在组件内正确显示,但在控制器中保持不变。
使用修饰符按钮显示Ember期望将属性设置为返回的属性,至少就绑定而言。 也就是说,修改后的值不会在“设置”操作之后立即传播回来。它仅在第二次设置操作后发送。不幸的是,在这种情况下,这完全打破了“绑定工作”的错觉。
不确定这是否是一个错误,但我对此表示怀疑。看起来很简单,以前有人会抓住它。
问题是,我该如何让它发挥作用?
我知道我可以使用两个属性:“inputValue”,其中控制器给出其基值,“outputValue”,它获取修改后的值(然后在控制器级别将它们绑定在一起)。
但那是超级笨重的。我有点希望有一个更优雅的解决方案。