【问题标题】:How to use underscore template tag from a backbone model?如何使用骨干模型中的下划线模板标签?
【发布时间】:2014-04-25 21:00:43
【问题描述】:

我有一个非常小的简单时间应用程序,它使用来自 api http://date.jsontest.com/ 的 json

除了从模型中调用模板内的 json 值外,基本上一切正常

   var Time = new Marionette.Application();

  Time.addRegions({
      mainRegion: "#main-region"
  });

  TimeModel = Backbone.Model.extend({
      defaults: {
          time: "Now",
          milliseconds_since_epoch: 1234,
          date: "Today"
      },
      urlRoot: 'http://date.jsontest.com/'

  });
  var TodaysTime = new TimeModel();

  TimeView = Marionette.ItemView.extend({
      template: "#template",
      model: TodaysTime,

      onRender: function () {
             TodaysTime.fetch({
                 success: function (apiTime) {
                  console.log(apiTime.attributes.time);
                  TodaysTime = apiTime;
              }
          });
      }

  });

  var timeView = new TimeView();
  Time.mainRegion.show(timeView);
  Time.start();

然后在我的模板中我有这个

<p><%- time %> <%- milliseconds_since_epoch %></p>

我没有收到任何错误,也没有显示任何内容,但函数内部的 console.log(apiTime.attributes.time) 工作正常

如果我在控制台中输入 TodaysTime.attributes.time 它也可以 但是如果我尝试&lt;p&gt;&lt;%- TodaysTime.attributes.time %&gt; &lt;/p&gt; 我会得到默认值Now

显示模型价值的正确方法是什么?

Github 链接测试https://github.com/nolawi/time-machine-test

【问题讨论】:

    标签: javascript json backbone.js underscore.js marionette


    【解决方案1】:

    这是因为您在从服务器获取数据之前渲染了模型。这就是您看到默认值的原因。您应该在模型、承诺或回调上使用侦听器。解决方法如下:

          ...
          var TodaysTime = new TimeModel();
          TodaysTime.fetch().done(function(){Time.mainRegion.show(timeView);});
    
          TimeView = Marionette.ItemView.extend({
              template: "#template",
              onRender: function() {
                  console.log('rendered');
                  TodaysTime.fetch({
                      success: function(apiTime) {
                          console.log(apiTime.attributes.time);
                      }
    
                  });
              }
    
          });
    
          var timeView = new TimeView({
            model: TodaysTime
          });
          ...
    

    评论后编辑: 嗯,这真的取决于你的情况。例如,有些人在路线中移动了这种逻辑。您可以添加 initialize 函数(但首先从 onRender 中删除 fetch)给您 ItemView。类似的东西:

    initialize: function () {
                    this.model.on('sync', this.render, this);
                    this.model.fetch({ reset: true, change: true });
                    return this;
                  }
    

    【讨论】:

    • 太好了,现在我知道为什么了!有一个更好的方法吗。我不应该从 ItemView 中获取吗?
    • 非常感谢!它似乎更有条理!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多