为什么这个绑定到另一个Ember对象不起作用?

时间:2014-01-07 18:19:12

标签: javascript ember.js

我已经设置了一个简单的Ember绑定示例,我认为应该可行:http://jsbin.com/aBekITeT/1/edit

为什么控制器的isTrue属性未与模型同步?没有找到任何“把东西放在窗户上是不好的做法”的东西(除非那实际上是什么打破了它);我在这里寻求理解。

我对http://emberjs.com/guides/object-model/bindings/的看法使我确信它应该以这种方式运作。有人可以解释我的解释错误吗?

1 个答案:

答案 0 :(得分:3)

  

除非那实际上是什么打破了它

这就是实际打破它的原因。绑定仅适用于Ember对象。 window不是Ember对象。路径错误也存在问题,这是一个图表:

   if isTrueBinding is "appController.isTrue",        This will:
   this won't work
               +--------------+                    +--------------+
               |              |                    |              |
      +-------+|    window    |+-----+             |    window    |
      |        |              |      |             |              |
      |        +--------------+      |             +--------------+
      v                              v                 +
  +---------------+        +--------------+            |
  | appController |        |  mod         |            |
  |---------------|        |--------------|            v
  | isTrue        |        |isTrueBinding |        +--------------+
  |               |        |              |        |  mod         |
  |               |        |              |        |--------------|
  |               |        |              |        |isTrueBinding |
  |               |        |              |        |appController |+---> +---------------+
  |               |        |              |        |              |      | appController |
  |               |        |              |        |              |      |---------------|
  |               |        |              |        |              |      | isTrue        |
  +---------------+        +--------------+        |              |      |               |
                                                   |              |      |               |
                                                   |              |      |               |
                                                   +--------------+      |               |
                                                                         |               |
                                                                         |               |
             i.e. bindings are implicitly pointing to "this",            |               |
             unless they start with a capital letter.                    +---------------+

当绑定以大写字母开头时,引用全局对象,例如:

window.Currency = Em.Object.create({
  "USD": "$"
});

App.MyObject = Em.Object.extend({
  currencyBinding: "Currency.USD"
});

但是,使用绑定绑定到全局对象在Ember中不被认为是好的样式 - 最佳实践是使用依赖注入来访问共享对象。如果您发现自己需要使用全局绑定,这可能是您需要重构的一个标志。