我的代码:
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适配器,对吗?
答案 0 :(得分:2)
我们最近有理由重新访问 ajaxpost ,并更新了the code和the 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中。
感谢各位插件。