使用带有下划线循环的回调函数.js骨干.js项目不起作用

Using callback function with loop in underscore.js of backbone.js project not working

本文关键字:js 函数 骨干 项目 不起作用 回调 下划线 循环      更新时间:2023-09-26

我正在用underscore.jsrequire.js开发backbone.js项目。

我创建了一个javascript回调函数,以便使用ajax从Web服务获取数据:

this.getProCallBack = function(type,callback){
var result = "";
  $.ajax({
    url: url, //rest url
    type:"GET", 
    dataType:"json",
    contentType: "application/json",
    success: function(response){
        result = callback(response);
    }
  });
}

这是骨干网的观点.js

 define(["jquery" ,
   "underscore" ,
   "backbone",
   "text!templates/Layout/ba.html",
   "promo"
 ],function($, _, Backbone, BannerTem, Promo){
    var BaView = Backbone.View.extend({
        initialize : function(){
        },
        render: function(options){
           var _banner = _.template(BannerTem);
           $(this.el).html(_banner({type : this.options.type}));
           return this;
       }
     });
     return BannerView;
 });

我正在使用text.js来调用带有html文件的下划线模板。

这是一个模板:ba.html

<div id="ei-slider" class="ei-slider">
 <ul class="ei-slider-large">
    <%
        var home = new Promo();
        home.getProCallBack(type,function(result){
        _.each(result, function(slideimg){
            switch(slideimg.ItemCount){
                case 0 :
                alert(slideimg.PromotionImage);
    %>
    <li>
        <a href="#detail/<%=slideimg.ItemList[0].UID%>">
            <img src="slideimg.PromotionImage%>" />
        </a>
    </li>
    <%
            break;
            default:
    %>
    <li>
        <a href="#detail" style="float: left;">
            <img src="slideimg.PromotionImage%>" />
        </a>
    </li>
    <%
        }
    %>
 </ul>
</div>

问题alert()正在case块中工作,但<img>没有显示在DOM中。

我不确定是因为_.each() callback功能不起作用或可能导致此问题的原因。

任何可能造成这种情况的原因。谢谢。

你的方法有点倒退。由于计时问题,AJAX 调用在模板中效果不佳。

您应该将逻辑从内到外,以便 AJAX 调用在您的视图中,并在$.ajax成功回调中处理模板。在您看来是这样的:

render: function(options){
    var _banner = _.template(BannerTem);
    var home    = new Promo();
    home.getProCallBack(this.options.type, function(result) {
        this.$el.html(_banner({result result}));
    }.bind(this));
    return this;
}

然后模板将更像这样:

<div id="ei-slider" class="ei-slider">
    <ul class="ei-slider-large">
        <% _.each(result, function(slideimg) {
            if(slideimg.ItemCount == 0) { %>
                <li>
                    <a href="#detail/<%=slideimg.ItemList[0].UID%>">
                        <img src="<%= slideimg.PromotionImage%>" />
                    </a>
                </li>
            <% } else { %>
                <li>
                    <a href="#detail" style="float: left;">
                        <img src="<%= slideimg.PromotionImage%>" />
                    </a>
                </li>
            <% }
        }) %>
    </ul>
</div>

我在此过程中将switch切换到if/elseswitch很难在下划线模板中正确处理,所以我倾向于不打扰。