0

我尝试创建我的第一个 ember.js 应用程序。日历-

我的日常模特

App.Day = Ember.Object.extend({
today : null,
dayNumber : null,
addEvent : function()   {
    console.log(this);
    $("#myModal").modal('show');
}
});

html 视图

<div class="cal">
    {{#each App.DayList}}
        {{#if this.today}}
        <div class="day today" {{action "addEvent" target="model" }}>
            {{#with this as model}}
            <span class="text">{{this.dayNumber}}</span>
            {{/with}}
        </div>
        {{else}}
        <div class="day" {{action "addEvent" target="model" }}>
            {{#with this as model}}
            <span class="text">{{this.dayNumber}}</span>
            {{/with}}
        </div>
        {{/if}}
    {{/each}}
    </div>

所以在点击日我会显示引导对话框,我不会加载外部数据,但我需要有关点击日的信息。

我的理解是我创建了一个视图

  App.DayDetails = Ember.View.extend({

});

在这个视图中我发送了一个ajax请求,但是如何在这个视图中获取有关点击日的信息?

4

1 回答 1

2

您几乎应该在视图中执行任何 AJAX。

视图做两件事:

(1) 画自己

(2) 响应 UI 事件(点击、打字等)

您的视图应该从控制器获取其内容,在这种情况下,我认为是 App.DayController 或 DayDetailsController。(这是另一回事,最好的做法是用VieworController等​​结束你的子类,所以它们的作用一目了然)。

控制器从哪里获取数据可能会使事情变得复杂。理想情况下,在一个成熟的应用程序中,您将拥有一个可以查询的数据存储(概念上是服务器端数据库和 ActiveRecord 的组合,如果您使用 rails)。然而,简单地说,您可以让控制器负责使用 jQuery 手动处理 ajax 请求。只要我们走捷径,您就可以在多个地方进行这样的调用(单例控制器、特定日期的项目控制器、日期模型本身),而不是视图。在采取这些捷径来限制传染时,这一点很重要......你应该用手动 ajax 做的就是获取 JSON,然后通过将其设置为一个阵列控制器。IE,通过尝试手动将数据插入视图或诸如此类的方式,无需再走一两步。如果可以避免,请不要与 Ember 战斗。

一些东西:

(1) 你的使用this是多余的,{{with}}声明也是如此。在{{each}}块内,上下文将是迭代中的当前对象(或其包装控制器,如果您使用 itemController)。(除非您使用“x in y”语法,在这种情况下,上下文仍然是控制器)

(2) 模型不应试图修改 DOM。相反,依靠绑定和您的控制器来协调 UI 更改。你可能想要做的是有一个App.DayController你可以穿上addEvent,然后在你的{{each}}使用itemController="App.DayController".

App.DayController = Ember.ObjectController.extend({
    addEvent: function () {
        // ...
    }
});

{{each}}然后,模板中每个循环的上下文将是每个单独的日控制器。控制器将自动成为视图的目标和上下文,因此您的模板将如下所示:

{{#each App.DayList itemController="App.DayController"}}
    <div {{bindAttr class=":day today"}} {{action addEvent}}>{{dayNumber}}</div>
{{/each}}

:in:day意味着day永远是一个类,但只有在上下文中today的属性为真时才会是一个类)today

因为每天都发送addEvent到它自己的控制器,所以无需弄清楚哪一天加载。

于 2013-03-06T12:23:15.680 回答