我有Ember.Select
的这个包装,以激活Select2
功能:
App.Select2SelectView = Ember.Select.extend({
prompt: 'Please select...',
classNames: ['input-xlarge'],
didInsertElement: function() {
Ember.run.scheduleOnce('afterRender', this, 'processChildElements');
},
processChildElements: function() {
this.$().select2({
// do here any configuration of the
// select2 component
escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
});
},
willDestroyElement: function () {
this.$().select2('destroy');
}
});
有时候我需要让一个下拉不可见,我这样做:
{{#if cityVisible}}
<div class="control-group">
<label class="control-label">City</label>
<div class="controls">
{{view SettingsApp.Select2SelectView
id="city-id"
contentBinding="currentCities"
optionValuePath="content.city"
optionLabelPath="content.city"
selectionBinding="controller.selectedCity"
prompt="Select a city"}}
<i class="help-block">Select the city for your geographical number</i>
</div>
</div>
{{/if}}
但只要下拉列表不可见,我就会收到以下错误:
Uncaught TypeError: Cannot call method 'select2' of undefined
我想该元素已插入,但后来被Ember
从DOM
(绑定属性cityVisible
)移除,因此jQuery
无法找到它?
我该怎么做才能避免该错误消息?我不想让视图可见/不可见,我希望将整个control-group
保留在cityVisible
控件下。
答案 0 :(得分:2)
这是ember删除视图的正常行为,作为解决方法,您可以执行以下操作:
<div {{bindAttr class="view.cityVisible::hideCities"}}>
<div class="control-group">
...
</div>
</div>
.hideCities {
display: none;
}
删除html块周围的{{#if}}
,然后用div
包裹它,而不是在其上设置包含display: none;
的css类,您可以使用cityVisible
或视图或控制器中的不同属性,并将其设置为true / false以切换其可见性。这个mecanisnm应该在DOM中保留你的html标记,因此可用于jQuery。请注意,如果您的citiesVisible
媒体资源存在于您的控制器中,则将view.
前缀从view.citiesVisible
移除为citiesVisible
,具体取决于您的设置。
请参阅演示here。
希望它有所帮助。