微风1.4.8& angular ajax adapter:如何自定义ajax设置?

时间:2014-01-21 20:39:02

标签: ajax angularjs breeze

我的代码:

breeze.config.initializeAdapterInstance("ajax", "angular", true);

...

var ajaxAdapter = breeze.config.getAdapterInstance('ajax');

ajaxAdapter.defaultSettings = {
    method: 'POST',
    data: {
        CompanyName: 'Hilo Hattie',
        ContactName: 'Donald',
        City: 'Duck',
        Country: 'USA',
        Phone: '808-234-5678'
    }
};

在breeze.debug.js的第14813行:

ngConfig = core.extend(compositeConfig, ngConfig);

compositeConfig.method的值为'POST',直到被覆盖,因为ngConfig.method的值为'GET'。

我认为这个问题与任何ajax设置有关,但当然我主要是如何使用有角度的ajax适配器进行发布,所以也许有更好的方法可以做到这一点?无论如何这种方法都很脏,但是breeze.ajaxPost.js只适用于jQuery ajax适配器,对吗?

3 个答案:

答案 0 :(得分:2)

2014年10月6日更新

我们最近有理由重新访问 ajaxpost ,并更新了the codethe documentation

原始推荐有效。我们只是澄清和更新快乐的道路。

几点:

  • ajaxpost 插件适用于jQuery和Angular ajax适配器。

  • 这些适配器很久以前就知道adapter.defaultSettings.headers并将它们混合到你的Breeze ajaxpost http电话中(请注意,PW Kad)。

  • 在使用'breeze.angular'服务替换默认ajax适配器后,必须明确调用breeze.ajaxPost()

  • 你可以明确地包装一个特定的ajax适配器:breeze.ajaxPost(myAjaxAdapter);我们不是自己这样做,因为根据我们的经验,省略params(breeze.ajaxPost())就足够了该方法查找并包装当前活动的ajax适配器。

文档解释了Angular用例,我在这里重复一下,为您节省时间:

// app module definition
var app = angular.module('app', ['breeze.angular']);  // add other dependencies

// this data service abstraction definition function injects the 'breeze.angular' service
// which configures breeze for angular use including choosing $http as the ajax adapter
app.factory('datacontext', ['breeze', function (breeze) {    // probably inject other stuff too
    breeze.ajaxPost(); // wraps the now-current $http adapter
    //... your service logic
}]);

原始回复

AHA!感谢plunker(以及巧妙地使用Todo-Angular样本的重置方法!)。

简而言之,实际问题是 breeze.ajaxpost.js 扩展了jQuery ajax适配器,而不是有角度的ajax适配器。有时间问题。

根本原因是你不能告诉 breeze.ajaxpost.js 要包装哪个适配器。它始终在运行时包装默认适配器。正如您现在加载脚本一样,当 breeze.ajaxpost.js 运行时,jQuery适配器是当前的适配器。

解决方法是在 breeze.ajaxpost.js 运行之前将默认适配器设置为角度适配器。

一种方法是按如下方式加载脚本...添加内联脚本以将默认ajax适配器设置为“angular”版本。

  <script src="breeze.debug.js"></script>
  <script>
        <!-- Establish that we will use the angular ajax adapter BEFORE breeze.ajaxpost.js wraps it! -->
        breeze.config.initializeAdapterInstance("ajax", "angular", true);
  </script>
  <script src="breeze.ajaxpost.js"></script>

显然这是一个黑客攻击。我们将研究如何更改 breeze.ajaxpost.js ,以便您可以在方便的时候包装任何ajax适配器。

答案 1 :(得分:2)

感谢您找到这个问题,并感谢Ward引起我的注意。我已按照您的描述更新breeze.ajaxpost.js代码以使用.data,并添加了一个可在适配器初始化后调用的函数。所以现在你可以这样做:

var ajaxAdapter = breeze.config.initializeAdapterInstance("ajax", "angular");
ajaxAdapter.setHttp($http);
breeze.ajaxpost.configAjaxAdapter(ajaxAdapter);  // now we can use POST

所以,它稍微不那么苛刻。

答案 2 :(得分:0)

此答案适用于以下插件和版本:
Breeze.Angular v.0.8.7
Breeze.AjaxPost v.1.0.6

我刚刚看到一个名为Breeze.Angular.js的新插件,它可以与Breeze.AjaxPost.js一起使用

您必须修改Breeze.AjaxPost.js才能使其正常工作。 Breeze.Angular.js在页面加载时初始化你的适配器,Breeze.AjaxPost.js将接受从Breeze.Angular.js初始化的适配器

您可以在此处了解有关Breeze.Angular服务器的更多信息:breeze-angular-service
您可以在此处了解有关Breeze.Ajaxpost的更多信息:breeze-ajaxpost

现在设置它并不是很明显,因为我把这两个文件完全放在了git中。

1。)按此顺序引用文件:

<script src="Scripts/q.min.js"></script>
<script src="Scripts/breeze.angular.js"></script>
<script src="Scripts/breeze.ajaxpost.js"></script>

2。)进入你的breeze.ajaxpost.js

删除此行(或评论此行):

breeze.ajaxpost(); // run it immediately on whatever is the current ajax adapter

原因是因为这会导致你的ajaxpost方法在你的breeze.angular服务之前运行。当您进入ajaxpost方法时,应该传入的ajaxAdapter参数将为null。删除此行会在以后的代码中附加该功能,因此您可以从breeze.angular服务中调用它。

3.)在breeze.angular.js中转到你的useNgHttp方法。它应该是这样的:

// configure breeze to use Angular's $http ajax adapter
var ajaxAdapter = breeze.config.initializeAdapterInstance("ajax", "angular");
ajaxAdapter.setHttp($http);
breeze.ajaxpost(ajaxAdapter);  // now we can use POST    

当您运行程序时,两个插件都应该能够为您设置环境,而不必将其包含在每个调用webapi的JavaScript中。

感谢各位插件。