【问题标题】:Output of icanhaz.js templete is [object Array] instead of the rendered template如果 [object Array] 而不是呈现的模板,则输出 icanhaz.js 模板
【发布时间】:2011-10-04 03:33:01
【问题描述】:

我正在使用 Zepto.js、ICanHaz.js 和 Backbone.js。我有几个要渲染的模板。渲染模板并将结果插入页面后,我看到的唯一输出是 [object Array] 或 [object HTMLTableElement]。

这是backbone.js路由器

InspectionsRouter = Backbone.Router.extend({
    routes: {
        "signin": "signin",
        "orders": "orders"
    },
    signin: function() {
        var signinForm = new SignInForm();
        $('div#content').html(signinForm.render());
    },
    orders: function() {
        InspectionsApp.active_orders = new Orders();
        InspectionsApp.active_orders.fetch({
            success: function() {
                var order_list = new OrderList({
                    collection: InspectionsApp.active_orders
                });
                $('div#content').html(order_list.render());
            },
            error: function() {
                Dialog.error("Unable to Load Active Orders");
            }
         });
    }
}); 

第一个模板是静态的,没有插入数据。这是代码

SignInForm = Backbone.View.extend({
    render: function() {
        this.el = ich.sign_in_form({});
        return this.el;
    }
});

另一个模板稍微复杂一些。

var OrderList = Backbone.View.extend({
    tagName: 'table',
    id: 'order_list',
    initialize: function() {
        _.bindAll(this, 'render');
    },
    render: function() {
        var active_orders = {};
        active_orders.orders = this.collection;
        $(this.el).html(ich.order_list(active_orders));
        return this.el;
    }
});

实际的模板并不是很复杂。第一个是简单的登录表格。接下来是一张桌子。

这是第一个模板。

<script id="sign_in_form" type="text/html">
    <h2 class="page_title">Sign In</h2>
    <form action="action/login.php" method="post" id="frm_login" name="frm_login">
         <fieldset id="credentials">
             <ol>
                 <li class="login">
                     <label for="email">E-mail Address</label>
                     <input type="email" name="email" id="email" tabindex="1" required>
                 </li>
                 <li class="login">
                     <label for="password">Password</label>
                     <input type="password" name="password" id="password" tabindex="2" required>
                 </li>
            </ol>
        </fieldset>
        <button class="button" id="btn_sign_in" type="submit" tabindex="3"><img src="icons/door_in.png">Sign In</button>
     </form>    
</script>

这是第二个模板。

<script id="order_list" type="text/html">
    <thead>
        <tr>
            <th>Name</th>
            <th>E-mail</th>
            <th>Status</th>
            <th>Created</th>
            <th>Assigned To</th>
        </tr>
    </thead>
    <tbody id="order_list_body">
        {{#orders}}
            <tr>
                <td>{{last_name}}, {{first_name}}</td>
                <td>{{email}}</td>
                <td>{{status}}</td>
                <td>{{created_at}}</td>
                <td>{{assigned_to}}</td>
            </tr>
        {{/orders}}
    </tbody>
</script>

任何帮助将不胜感激。问题似乎出在 ICanHaz 或 Backbone 中。我已经尝试使用 render 方法警告 this.el,但仍然遇到同样的问题。

【问题讨论】:

  • ich.order_list(active_orders)ich.sign_in_form({}) 返回什么?尝试将它们记录到控制台。看来问题可能与 icanhaz 有关。
  • 这里是日志的输出:ich.templates.order_list 看起来是正确的。 ich.order_list(active_orders) 记录“[]”。 ich.templates.sign_in_form 看起来是正确的。 ich.sign_in_form() 记录一个数组,其中 h2 元素作为第一项,表单元素作为第二项。

标签: javascript templates backbone.js zepto icanhaz.js


【解决方案1】:

我发现了这个问题。 ICanHaz.js 默认返回一个 jQuery 或 Zepto 对象。 (我期待一个字符串。)您可以向 ich.template 函数添加第二个参数来触发原始字符串输出。返回 Zepto 对象不会有问题,只是在 Zepto 中,$.html() 不接受 Zepto 对象。选项是让 ICanHaz.js 输出原始字符串,或者使用接受 Zepto 对象的 Zepto 方法之一(追加、前置、之前、之后)。

要将数组呈现为字符串,只需使用: ich.myRenderFunction(myObject, true);

【讨论】:

  • 感谢您提供适合您的解决方案!它可能对某人有用。请注意,您应该“接受”您自己的答案,以便问题在列表中显示为已回答。
  • 指定第二个参数的形式会很有帮助,或者至少提供一个文档链接。
  • 这对我有帮助,但你真的应该写下第二个参数应该是什么。
  • 刚刚从伟大的谷歌怪物那里偶然发现了这个。答案在 ICH 网站上,内容为:对于您定义的每个模板(部分模板除外),ICanHaz 都会构建一个具有相同名称的检索函数。如果您不想要 jQuery 对象,而只想要填充的字符串,您可以传入 true 作为第二个参数来获取原始字符串。如果您的模板不生成 html,这将非常有用。因此,将 true 作为第二个参数传入即可。
【解决方案2】:

当模板未正确解析时,我会遇到这种情况:通常是实际模板中的错误。验证模板数据没有问题并且已正确加载。

【讨论】:

  • 我找不到模板的问题。我已将它们添加到上面的问题中。有什么方法可以检查模板是否已正确解析?
  • 奇怪,但是如果在第二个模板中的所有{{ 字符串之后和}} 之前插入一个空格会发生什么?编辑:在这里取笑我,但我必须在我的 icanhaz 项目中这样做,并且想看看这是否真的是一个问题?
  • 我尝试添加空格。它没有影响。出现同样的问题。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2015-01-10
相关资源
最近更新 更多