我应该使用:
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)
我认为第一个是...冗长。有什么理由不使用第二种方法吗?
在寻找答案的过程中,我发现了这个帖子:Definitive Guide of When to use .get on Discuss.emberjs.com。
根据gordon_kristan的回答:
始终使用 get(),并通过以下两种方式之一使用它:
Run Code Online (Sandbox Code Playgroud)// 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');使用 get() 是确保 Ember 计算属性始终正常运行的唯一方法。例如,在您的示例中,考虑模型是否是 PromiseObject(Ember-Data 经常使用它):
Run Code Online (Sandbox Code Playgroud)// 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');
此外,正如克里斯托弗指出的:
如果is ,则使用
obj.get('very.deeply.nested.property')只会抛出未定义的错误。如果链中的任何其他属性是,则对的调用将简单地返回 。相反,如果您在每个级别调用,那么如果任何级别为 ,它都会抛出错误。objundefinedundefinedget()undefinedget()undefined
如果您想阅读源代码,请查看ember-metal/lib/property_get。