gpt4 book ai didi

ember.js - Ember、Ember-data 和 jquery-ui.dialog, "Oh my!"

转载 作者:行者123 更新时间:2023-12-02 06:11:38 25 4
gpt4 key购买 nike

任务:
在灯箱中打开表单以创建新的“事件”;打开的表格应该可以收藏。
路障:

  • 有使用 {{action}} 打开灯箱的示例标签,但找不到在自己的 route 打开的标签。
  • 有许多使用旧版本 ember.js 的示例。
  • 没有很多与 ember-data 和 REST 相关的文档(我知道,我知道......它还没有“准备好生产”)。

  • 问题:
    表单中的字段没有绑定(bind)到支持模型,因此“null”被发布到我的 servlet(一个 Spring Controller )。
    我的第一次迭代与 final outcome (jsfiddle) 相差不远。 .最终使它起作用的东西交换了这个:
    EP.EventsNewRoute = Ember.Route.extend({
    ...
    setupController : function(controller, model) {
    controller.set("model", model);
    },
    ...
    });
    ...为了这:
    EP.EventsNewRoute = Ember.Route.extend({
    ...
    setupController : function(controller, model) {
    this.controllerFor("events-new").set("model", model);
    },
    ...
    });
    问题:
    为什么setupController函数需要调用 controllerFor为了正确设置模型?

    最后,由于我努力寻找一个功能齐全的示例,我想让它易于访问(并希望发现改进)。
    这是 fiddle : http://jsfiddle.net/6thJ4/1/
    这里有几个片段。
    HTML:
    <script type="text/x-handlebars">
    <div>
    <ul>
    {{#linkTo "events.new" tagName="li"}}
    Add Event
    {{/linkTo}}
    </ul>
    </div>
    {{outlet events-new}}
    </script>
    <script type="text/x-handlebars" data-template-name="events-new">
    <form>
    <div>
    <label>Event Name:</label>
    {{view Ember.TextField valueBinding="name"}}
    </div>
    <div>
    <label>Host Name:</label>
    {{view Ember.TextField valueBinding="hostName"}}
    </div>
    </form>
    </script>
    JavaScript:
    ...
    EP.Router.map(function() {
    this.resource("events", function() {
    this.route("new");
    });
    });
    EP.EventsNewRoute = Ember.Route.extend({
    model : function() {
    return EP.Event.createRecord();
    },
    setupController : function(controller, model) {
    //controller.set("model", model); // Doesn't work? Why not?
    this.controllerFor("events-new").set("model", model); // What does this do differently?
    },
    ...
    });
    EP.EventsNewController = Ember.ObjectController.extend({
    save : function() {
    this.get("content.transaction").commit(); // "content.store" would commit _everything modified_, we only have one element changed, so only "content.transaction" is necessary.
    }
    });
    EP.EventsNewView = Ember.View.extend({
    ...
    });
    EP.Event = DS.Model.extend({
    name : DS.attr("string"),
    hostName : DS.attr("string")
    });
    资源:
  • http://emberjs.com/guides/routing/setting-up-a-controller/
  • http://emberjs.com/guides/getting-started/toggle-all-todos/ (试图模仿我学到的东西,但是将添加新的东西变成新的路线)
  • Writing a LightboxView causes problems / Integrating DOM Manipulating jQuery-Plugins makes actions unusable (灯箱“示例”)
  • Dependable views in Ember (另一个灯箱“示例”,但没有打开灯箱的路线)
  • 最佳答案

    Why does the setupController function need to call controllerFor in order to properly set up the model?



    Ember 使 URL 成为其约定中不可或缺的一部分。这意味着 state你的应用程序由它所在的路由表示。您已经正确理解了其中的大部分内容。但是有几个微妙的细微差别,我将在下面澄清。

    首先考虑一个具有以下 URL 的应用,
  • /posts - 显示博客文章列表。
  • /posts/1 - 显示单个博客文章。

  • 并说单击列表中的帖子 /posts带你到 /posts/1 .

    在这种情况下,用户可以通过两种方式查看 /posts/1 上的帖子。 .
  • 前往 /posts并点击第一个帖子。
  • 通过输入 /posts/1 ,通过书签等

  • 在这两种情况下, PostRoute对于 /posts/1将需要与 Post 对应的模型标识 1。

    首先考虑直接输入场景。为了提供一种查找 id=1 后模型的方法,您可以使用,
    model: function(params) {
    return App.Post.find(params.post_id);
    }

    您的帖子模板将获取模型,并且可以使用其属性进行渲染。

    现在考虑第二种情况。点击 id=1 的帖子会跳转到 /posts/1 .为此,您的模板将使用 linkTo像这样。
    {{#linkTo 'post' post}} {{post.title}} {{/linkTo}}

    在这里,您正在传递 post型号为 linkTo helper 。然后它将帖子的数据序列化为 URL,即:-'/posts/1'。当您单击此链接时,Ember 意识到它需要渲染 PostRoute但它已经有了 post 模型。所以它跳过模型钩子(Hook),直接调用 setupController .

    默认 setupController设置为简单地在 Controller 上分配模型。它的实现是为了做类似的事情,
    setupController: function(controller, model) {
    controller.set('model', model);
    }

    如果您不需要在 Controller 上设置自定义属性,则不需要覆盖它。注意:如果你用额外的属性来扩充它,你仍然需要调用 _super确保执行默认的 setupController 行为。
    setupController: function(controller, model) {
    this._super.apply(this, arguments);
    controller.set('customProp', 'foo');
    }

    最后一个警告,如果您使用 linkTo并且路线没有 dynamic segments ,那么模型钩子(Hook)仍然被调用。如果您认为您正在链接到 /posts,则此异常是有意义的。路线。然后模型钩子(Hook)必须触发,否则 Ember 没有数据来显示路线。

    这让我们找到了你问题的症结所在。快到了,我保证!

    在您的示例中,您使用的是 linkTo前往 EventsNewRoute .进一步您的 EventsNewRoute没有动态段,因此 Ember 调用 model钩。和 controller.set("model", model);与在 controller 上设置模型一样有效.

    问题与您对 renderTemplate 的使用有关。 .当您使用 render{{render}}模板中的助手,您实际上获得了与您正在使用的 Controller 不同的 Controller 。此 Controller 与您设置的 Controller 不同 model上,因此错误。

    一种解决方法是在选项中传递 Controller ,这就是 renderTemplate 的原因。将此 Controller 作为参数。
    renderTemplate: function(controller) {
    this.render("events-new", {
    outlet : "events-new", controller: controller
    });
    }

    这是更新的 jsfiddle .

    最后说明:与此问题无关,您收到警告,

    WARNING: The immediate parent route ('application') did not render into the main outlet and the default 'into' option ('events') may not be expected



    为此,您需要阅读 answer .警告,这是另一堵文字墙! :)

    关于ember.js - Ember、Ember-data 和 jquery-ui.dialog, "Oh my!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17820125/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com