将Ember.Map绑定到Ember.TextField值

时间:2013-01-04 12:03:13

标签: ember.js

如何将Ember Map值绑定到TextField值。假设我有这样的配置:

App.AppsController = Em.Controller.extend({
    selections: null
});

App.AppsRoute = Ember.Route.extend({
    setupControllers: function(controller, model) {
        controller.set('selections', Ember.Map.create());

    }
});

在我的模板中:

{{view Ember.TextField valueBinding="bindingToMap"}}

我尝试过valueBinding="controller.selections.somekey",其中somekey是我地图中的关键字。但是,该值永远不会受到约束。请注意,最初地图为空。这可能是问题的根源吗?

编辑: 我也尝试在控制器中使用带有整数值的绑定,它可以工作。所以当我绑定一个更复杂的数据结构(如Map)时会出现问题。我在文档中找不到任何解释如何绑定地图的内容。

1 个答案:

答案 0 :(得分:2)

警告:我自己对Ember很新。

看看Ember.Map的实现,我认为你现在不能(在1.0.0-pre2中)这样做。 Ember.Map实现creategetset,但是不是正常的Ember对象。因此,除了其他方面,地图中的“属性”不是真正的属性,并且没有可观察的支持。车把的实施很大程度上依赖于可观察的支持,所以我认为你所做的事情是行不通的。

如果我错了,有人会纠正我,但这是我在1.0.0-pre2代码中看到的内容:

var Map = Ember.Map = function() {
  this.keys = Ember.OrderedSet.create();
  this.values = {};
};

/**
  @method create
  @static
*/
Map.create = function() {
  return new Map();
};

Map.prototype = {
  /**
    Retrieve the value associated with a given key.

    @method get
    @param {anything} key
    @return {anything} the value associated with the key, or undefined
  */
  get: function(key) {
    var values = this.values,
        guid = guidFor(key);

    return values[guid];
  },
...

指出,它实现了自己的get(和create)而不是扩展Ember.Object ......所以没有可观察到的支持。虽然如果reopen晚些时候我可能会错过它。

编辑:

另外,并不是你提出的问题,但如果你正在构建依赖于某些键存在的接口,那么你应该真正定义自己的模型类,它们将这些键作为属性。如果它们“未设置”,您仍然可以将它们设置为null。如果您还需要设置任意键的功能,请将您的某个属性设置为Ember.Map并将其命名为otherProperties或其他内容,并将其放入其中。但是,如果您的视图依赖于已知密钥,则它应该是已定义的属性。