Ember.js 在方法中设置属性时防止余烬观察者触发
我在一个属性上设置了一个观察,在用户键入时填充/过滤公司名称列表。缩小列表后,用户可以单击列表中的一个项目。它有点像一个自动完成一些差异,使它的工作方式,我希望它在移动设备上。当用户开始键入表单上的所有其他控件时,当用户选择公司名称时,列表被隐藏,其他字段再次显示,还有一个按钮将关闭列表并显示其他控件,而用户不选择公司。除了我无法阻止当用户选择一家公司并且在选择该公司时运行的操作中设置了拥有该观察者的company name属性时,观察者将被触发之外,其他一切都可以正常工作 以下是控制柄条模板的一部分:Ember.js 在方法中设置属性时防止余烬观察者触发,ember.js,coffeescript,handlebars.js,observer-pattern,Ember.js,Coffeescript,Handlebars.js,Observer Pattern,我在一个属性上设置了一个观察,在用户键入时填充/过滤公司名称列表。缩小列表后,用户可以单击列表中的一个项目。它有点像一个自动完成一些差异,使它的工作方式,我希望它在移动设备上。当用户开始键入表单上的所有其他控件时,当用户选择公司名称时,列表被隐藏,其他字段再次显示,还有一个按钮将关闭列表并显示其他控件,而用户不选择公司。除了我无法阻止当用户选择一家公司并且在选择该公司时运行的操作中设置了拥有该观察者的company name属性时,观察者将被触发之外,其他一切都可以正常工作 以下是控制柄条模板的
{{#each account in accounts}}
<div class="small-12 columns trim"style="background-color:white">
<a href="#" {{action selectAccount account}}>{{account.name}}</a>
</div>
{{/each}}
我不太清楚到底发生了什么,我尝试设置另一个标志来禁止它运行,并在最后一行设置该标志,但不知何故,在selectAccount:controller.set('isSearch',false)的最后一行运行之后,观察者再次激发并执行该操作,我最终再次显示搜索控件。因此,具体来说,它会返回到正常控件一秒钟,然后再次显示搜索控件。我不确定我的代码中是否有错误,或者我是否需要找到一种方法删除观察者并在完成后将其添加回。我已经用头撞了好几个小时了,希望有人能帮我弄清楚。谢谢。我不确定我是否完全理解这个问题,但是你说“我无法阻止观察员开火”,那么根据需要添加/删除观察员如何
addCompanyNameObserver: function() {
this.addObserver('companyName', this.searchAction);
},
removeCompanyNameObserver: function() {
this.removeObserver('companyName');
},
...
loadPage: function() {
...
this.addCompanyNameObserver();
},
cancelAccountSearch: function() {
...
this.removeCompanyNameObserver();
}
我想我会发布我发现的解决方案,这可能不是一个完美的方法,但它是有效的。在实际观察者中添加标志:
searchObserver: Ember.observer('companyName', () ->
if @get('allowSearch')
Ember.run.debounce(@, @searchAction, 500)
)
在这里设置:
selectAccount: (account) ->
controller = @
@set('allowSearch', false)
controller.set('companyName', account.name)
controller.set('selectedAccount', account)
controller.set('accountSearchStyle', 'display:none')
controller.set('standardControlStyle', 'display:block')
controller.set('isSearch', false)
@set('allowSearch', true)
解决我的问题。看起来是在去盎司后检查标志导致了问题 我想这可能是一种方法,但我还没能让它起作用。我不熟悉余烬和咖啡脚本,所以可能是我做错了什么。
selectAccount: (account) ->
controller = @
@set('allowSearch', false)
controller.set('companyName', account.name)
controller.set('selectedAccount', account)
controller.set('accountSearchStyle', 'display:none')
controller.set('standardControlStyle', 'display:block')
controller.set('isSearch', false)
@set('allowSearch', true)