Ember.js,“修饰符”属性

时间:2015-06-03 14:41:17

标签: javascript ember.js

观察以下演示:

(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”,它获取修改后的值(然后在控制器级别将它们绑定在一起)。

但那是超级笨重的。我有点希望有一个更优雅的解决方案。

0 个答案:

没有答案