ember.js 我应该在Ember中用chain 'get()' s,还是可以用点标记法?

xfb7svmp  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(86)

我应该用途:

this.get('controller').get('simpleSearch').get('selectedOptions').get('height')

this.get('controller.simpleSearch.selectedOptions.height')

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

woobm2wo

woobm2wo1#

不记得我在哪里读到的ember网站,但他们建议最好的解决方案是点符号。

this.get('controller.simpleSearch.selectedOptions.height')
hjzp0vay

hjzp0vay2#

在寻找答案的过程中,我发现了这条线索:在discuss.emberjs.com上执行Definitive guide of when to use .get
根据gordon_kristananswer
请始终使用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');

使用get()是确保Ember计算属性始终正常工作的唯一方法。例如,在您的示例中,假设model是一个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');

此外,正如christopher指出的:
使用obj.get('very.deeply.nested.property')只会在objundefined时掷回未定义的错误。如果链接中的任何其他属性为undefined,则呼叫get()只会传回undefined。如果您在每个层级呼叫get(),则任何层级为undefined时都会掷回错误。
如果你想阅读源代码,请查看ember-metal/lib/property_get。

oknwwptz

oknwwptz3#

现代的Javascript/浏览器允许使用.表示法,甚至不必执行get。您也可以研究Optional Chaining,它允许您在不出错的情况下冒泡null值。
例如:

// All 3 are identical
x = this.get("property").get("value");
x = this.get("property.value");
x = this.property.value;

// Error!
x = this.nonexistent_property.value

// Sets x to null
x = this.nonexistent_property?.value

相关问题