javascript - 仅在ajax完成后加载部分html View - 同步

标签 javascript ajax backbone.js synchronization marionette

在使用 ajax 从 templateHelper 获取结果后,我需要加载部分 html 模板。

在我的ItemView代码中:

templateHelpers: {
  currentUserCan:  function(action) {
    $.when( currentUser.can(action) ).done(function(permission){
      return permission;
    });
  }
}

可以功能:

can: function( action ){

 var defer = $.Deferred(),
 params = { .... }

 $.get( config[ 'api' ] , params)
 .done(function(response) {
    defer.resolve(response['permission'])
  })
 .fail(function(response){
    defer.resolve(false) 
  });

  return defer.promise();
}

我的模板:

<div class="large-8 columns">
  <p><% if (currentUserCan('some_action')) {  do something, console.log("can") } else { console.log('can not')}%></p>
  <p>Last Status:<%= date %></p>
</div>

<div class="large-8 columns">
...
...

由于异步ajax,我的结果是未定义的,并且在控制台上“不能”,尽管它是真的。 如何仅在 ajax 完成后才在 if 语句中加载我的代码?

最佳答案

不要尝试以“同步方式”使用异步代码。

也许,这对您来说是一个很好的解决方案:

templateHelpers: {
  currentUserCan:  function(action) { return currentUser.can(action); }
}
  • 这里我们从函数返回 Promise,因为我们想要对异步操作完成使用react。

<div class="large-8 columns"> <p><% $.when(currentUserCan('some_action')).done(function(permission) { if(permission) console.log("can"); else console.log('can not'); }) %></p> <p>Last Status:<%= date %></p> </div>

  • 这里我们直接从模板中使用 Promise。

关于javascript - 仅在ajax完成后加载部分html View - 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141392/

相关文章:

javascript - HTML 中的未知标签

jquery - 将主干集合/javascript 对象与来自服务器的新模型相结合

javascript - 隐式和显式混合之间的区别

javascript - 没有像 d3 这样的库的单调三次插值的 SVG 实现

javascript - 在 cujojs rest.js 上中止 Xhr

javascript - 当按钮从 ajax 调用时,jquery 不起作用

javascript - 未定义 foreach 作为 AJAX 选项

javascript - 似乎无法清理分离的 DOM 元素

javascript - 如何在 Opera 中设置样式显示?

javascript - 更改事件问题上的条纹元素