我试图以某种方式将以下模型的属性绑定到控制器,以便在模型完成其异步调用时设置模型的length属性,然后通知控制器更改并可以更新视图。
App.Articles = Ember.Object.extend()
App.Articles.reopenClass
store: {}
lengths: 0
findAll: ->
arr = Ember.ArrayProxy.create()
$.ajax
url: 'http://ajaxcall.asp',
dataType: 'json'
context: @
success: (response) ->
Ember.set(App.Articles, 'lengths', response.store.length)
response.store.forEach (news, i) =>
txt = '<p>' + news.fields[2].text.replace(/[\r\n]+(?=[^\r\n])/g,'</p><p>') + '</p>'
article =
'id': i
'date': news.fields[1].date
'title': news.fields[0].text
'text': txt
'short': news.fields[2].text.substring(0, 120) + '...'
art = @findOne(article.id)
art.setProperties(article)
return
values = (values for keys, values of @store)
arr.set('content', values)
callback = ->
$('.loader-container').removeClass('show')
$('#articles-scroll').css('height', $(window).height() - 55)
articles_scroll = new iScroll 'articles-scroll',
vScroll: true, hScroll: false, vScrollbar: false
return
setTimeout callback, 100
return
arr
findOne: (id) ->
art = @store[id]
if not art
art = App.Currencies.create
id: id
@store[id] = art
art
所以我需要完成的是设置调用完成后返回的数据长度,并用这样的方式监听控制器中的更改:
lengths: (->
console.log 'test'
).property('App.Articles.lengths')
但是,我对上面的代码没有好运,我不知道如何解决这个问题。
答案 0 :(得分:2)
如果要在模板中使用该值,只需使用控制器的长度属性:{{controller.length}}
。
如果要观察控制器中的length属性:
App.ArticlesController = Ember.ArrayController.extend({
lengthDidChange: function() {
console.log("Length changed to: " + this.get('length'));
}.observes('length')
});
如果您在路由的model
挂钩或其他位置设置了带有articles数组的控制器。
<强>更新强>
如果您想要一次性通知,请将Ember.Evented
与ArrayProxy
中的findAll
混合(省略不需要的内容):
App.Articles.reopenClass
...
findAll: ->
arr = Ember.ArrayProxy.createWithMixins(Ember.Evented)
$.ajax
...
success: (response) ->
...
arr.set('content', values)
arr.trigger('didLoad')
App.ArticlesRoute = Ember.Route.extend
model: ->
App.Articles.findAll()
setupController: (controller, model)->
model.one 'didLoad', ->
console.log controller.get('lastObject`)