1

目前,我尝试将我的 ember.js 应用程序与我的网络服务器连接起来。Web 应用程序有一个日期选择器。选择日期后,我喜欢我的模型“重新加载”。重新加载是指向我的网络服务器询问包含特定日期的新数据。

在下面,您会看到我与服务器联系以获取所需信息的路线。

App.PicturesRoute = Ember.Route.extend({
    model: function(params) {
        return $.getJSON('http://api.<server>.com/pictures?date=' + params.date).then(function(data) {
            return data.pictures.map(function(picture) {
                picture.body = picture.content;
                return event;
            });
        });
    }
});

如果我在字符串中手动写入日期,一切正常并且我收到数据。现在,我有一个问题,我不知道如何动态地做到这一点。我应该如何在 UI 和模型之间创建最佳连接。当然我可以在我的控制器中实现一个动作,但是这个控制器应该如何调用/重新加载模型呢?

4

1 回答 1

0

由于date是您的 URL 的一部分,您应该只使用transitionToor transitionToRoute。您可能设置了一个路由,允许您匹配看起来像/pictures/2013-10-09. 事情变得有点古怪,因为2013-10-09它并不是一个真正的对象 ID。通常使用transitionToRouteEmber 时,您会传递一个代表您要过渡到的内容的实时模型。model如果直接命中路由(没有link-toor transitionTo),这将是 Ember 通过执行钩子查找的相同对象。由于日期实际上是一个查询参数而不是一个 id,因此您可以使用该setupController方法来解决这个问题。

因此,您的路线可能看起来像这样(这是简化的,当然,您需要使用适当的 AJAX 调用):

App.PicturesRoute = Ember.Route.extend({
  model : function(params){
    console.log('calling model for PicturesRoute');
    return { date : params.date }; // return a fake model
  },
  setupController : function(controller, model){
    // Make sure not to call super since we don't want to set
    // a single object instead of an array
    // this._super(controller,model); <-- do not use!
    console.log('calling setupController for PicturesRoute');
    // Instead set the `date` property directly
    controller.set('date',model.date);
    // Then find/build an array and set it as the model
    var pictures = [
      {name : "Pic 1 - " + model.date},
      {name : "Pic 2 - " + model.date}
    ];
    controller.set('model',pictures);
    console.log(model);
  }
});

然后在应用程序中,当您检测到日期选择器的更改时,您会调用如下内容:

var dateFromPicker = ... // however you get a hold of the date string from the picker
var fakeModel = { date : dateFromPicker };
this.transitionTo('pictures',fakeModel);

这是一个 JSBin,显示了这个想法的一个非常简化的版本:http: //jsbin.com/ucanam/1396/edit

我希望这是有道理的。

于 2013-10-10T01:21:05.633 回答