Javascript 如何将模型类的属性绑定到控制器?

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

我试图以某种方式将以下模型的属性绑定到控制器,以便当模型完成其异步调用时,设置模型的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     

但是,我对上面的代码没有把握,我不知道如何解决这个问题。

如果您想在模板中使用该值,只需使用控制器的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`)