我应该在 Ember 中链接 `get()`s,还是可以使用点表示法?

Nat*_*man 5 ember.js

我应该使用:

this.get('controller').get('simpleSearch').get('selectedOptions').get('height')
Run Code Online (Sandbox Code Playgroud)

或者

this.get('controller.simpleSearch.selectedOptions.height')
Run Code Online (Sandbox Code Playgroud)

我认为第一个是...冗长。有什么理由使用第二种方法吗?

Max*_*ace 2

在寻找答案的过程中,我发现了这个帖子:Definitive Guide of When to use .get on Discuss.emberjs.com

根据gordon_kristan回答

始终使用 get(),并通过以下两种方式之一使用它:

// If obj is guaranteed to not be null or undefined
obj.get('very.deep.nested.property');
// If obj might be null or undefined, or if it's not an Ember object,
Ember.get(obj, 'very.deep.nested.property');
Run Code Online (Sandbox Code Playgroud)

使用 get() 是确保 Ember 计算属性始终正常运行的唯一方法。例如,在您的示例中,考虑模型是否是 PromiseObject(Ember-Data 经常使用它):

// This will not work, since it won't activate the `unknownProperty` handler on `model`
var startDate = parentView.controller.model.createdAt;
// But this will work
var startDate = Ember.get(parentView, 'controller.model.createdAt');
Run Code Online (Sandbox Code Playgroud)

此外,正如克里斯托弗指出的:

如果is ,则使用obj.get('very.deeply.nested.property')只会抛出未定义的错误。如果链中的任何其他属性是,则对的调用将简单地返回 。相反,如果您在每个级别调用,那么如果任何级别为 ,它都会抛出错误。objundefinedundefinedget()undefinedget()undefined

如果您想阅读源代码,请查看ember-metal/lib/property_get