Javascript 如何将模型类的属性绑定到控制器?
我试图以某种方式将以下模型的属性绑定到控制器,以便当模型完成其异步调用时,设置模型的length属性,然后将更改通知控制器并更新视图Javascript 如何将模型类的属性绑定到控制器?,javascript,model-view-controller,asynchronous,ember.js,coffeescript,Javascript,Model View Controller,Asynchronous,Ember.js,Coffeescript,我试图以某种方式将以下模型的属性绑定到控制器,以便当模型完成其异步调用时,设置模型的length属性,然后将更改通知控制器并更新视图 App.Articles = Ember.Object.extend() App.Articles.reopenClass store: {} lengths: 0 findAll: -> arr = Ember.ArrayProxy.create() $.ajax url
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
但是,我对上面的代码没有把握,我不知道如何解决这个问题。如果您想在模板中使用该值,只需使用控制器的length属性:
{{controller.length}
如果要观察控制器中的length属性,请执行以下操作:
App.ArticlesController = Ember.ArrayController.extend({
lengthDidChange: function() {
console.log("Length changed to: " + this.get('length'));
}.observes('length')
});
前提是您在路线的模型
挂钩或其他地方使用物品数组设置控制器
更新:
如果需要一次性通知,请将Ember.Evented
混合到从findAll
返回的ArrayProxy
中(不需要的内容省略):
加博,谢谢你的回复。我不需要监视每一个更改,我只需要在调用完成后设置一个特定的项目。如果我观察到长度的变化,我将在每次变化时设置一篇文章,而我所需要的只是在它们全部加载后设置一篇。有什么想法吗?你能再解释一下“我只需要设置一篇特定的文章”吗?加博-谢谢你回复我。因此,页面正在加载左侧的文章列表,我想在右侧填充页面首次加载时列表中一篇文章的详细信息。我想使用传入数据中的最后一篇文章(因为这是最新的一篇文章)。我遇到的问题是,我需要等待数据完全加载,然后才能知道有多少篇文章进入并选择最后一篇。但是我不知道如何让模型以某种方式通知控制器调用已完成,并且它现在有x个项目数。控制器的
lastObject
属性将始终表示最后一个元素。Gabor-但是如何等到模型完全填充后再获取lastObject?有没有一种方法可以让模型通知已经完成ajax调用的控制器?
App.ArticlesController = Ember.ArrayController.extend({
lengthDidChange: function() {
console.log("Length changed to: " + this.get('length'));
}.observes('length')
});
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`)