Angular template and .NET Partial Postback
Angular template and .NET Partial Postback
我在处理.Net部分回发时遇到了一个问题。
问题与此基本相同:在部分回发后重新初始化角度绑定
基本上,我有一个选项卡,上面有angular应用程序,然后我有第二个带有c#控件的选项卡,我必须在选项卡之间进行部分回发,当我返回到我的应用程序时,什么都没有。
我尝试了ngView路由,然后尝试了$route.reload()
(它转到控制器,我可以看到模板正在被拉下,但页面上的结果是没有)。然后我尝试了这里提到的compile(templateCache.get(lazyTableControllerRoute.current.templateUrl))(scope)
。没有什么
请帮助:)
每次回邮后,我都会把这个html:放在页面上
LiteralControl lazyControl = new LiteralControl("<div ng-app='"LazyLoadingApp'" style='"padding:10px'" ng-controller='"LazyTableController'" ng-view><lazy-table> </lazy-table></div>");
Controls.Add(lazyControl);
以及一些配置常量,如templateUrl
。
这是我的代码:
var app = angular.module('LazyLoadingApp', ['ui.bootstrap', 'ngRoute'], function ($interpolateProvider) {
$interpolateProvider.startSymbol('[[');
$interpolateProvider.endSymbol(']]');
});
app.config(function ($routeProvider, $locationProvider, tableTemplateUrl) {
$routeProvider.when('/Page.Web.UI/sptl_project.aspx', {
controller: 'LazyTableController',
templateUrl: tableTemplateUrl,
});
// configure html5 to get links working on jsfiddle
$locationProvider.html5Mode(true);
});
//**This objects I am using after partial postback to check in the console if e.g. $route.reload() works..**
var lazyTableControllerRoute = null;
var templateCache = null;
var compile = null;
var scope = null;
app.directive('lazyTable', ['tableTemplateUrl',
function (tableTemplateUrl) {
return {
name: 'lazyTable',
priority: 0,
restrict: 'E', // E = Element, A = Attribute, C = Class, M = Comment
templateUrl: tableTemplateUrl
};
}
]).controller('LazyTableController', ['$scope', '$rootScope', 'lazyFactory', 'opsPerRequest', 'header', '$route', '$templateCache', '$compile',
function ($scope, $rootScope, lazyFactory, opsPerRequest, header, $route, $templateCache, $compile) {
lazyTableControllerRoute = $route;
var loadingPromise = null;
templateCache = $templateCache;
compile = $compile;
scope = $scope;
(...) rest is not important
更新:
我试着使用require.js。(同样,它在整个页面加载后工作。)我的想法是在部分回发后引导元素。我构建了一个简单的测试用例,在更新面板和我的应用程序中有一个简单按钮,只是进行部分回发。点击后(当应用程序消失时)我尝试在控制台:
angular.bootstrap(document, ['LazyLoadingApp'])
但后来我得到了一个我无法删除的错误:
App Already Bootstrapped with this Element 'document'
以下是以require.js方式为应用程序提供的plunker(但请记住,它只是用于代码审查目的。)
- 不要同时使用ng-app和angular.bootstrap
- 你编译了"ng-app"吗?如果是的话,不要
ngtutorial.com/learn/bootstrap
好吧!问题已解决。。因此,为了处理部分回发,您需要:
这样定义应用程序:(记住你必须从html中删除ng应用程序!)
<base href="/">
<asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="fire" runat="server" Text="fire!" />
<div id="parent" > <div id="boodstapped" ng-view ></div></div>
</ContentTemplate>
</asp:UpdatePanel>
像这样实例化应用程序:
var app = angular.module('LazyLoadingApp', ['ui.bootstrap', 'ngRoute']);
jQuery(document).ready(function ($) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
function EndRequestHandler(sender, args) {
jQuery('#parent').children().remove();
jQuery('#parent').append('<div id="boodstapped" ng-view ></div>');
angular.bootstrap(jQuery('#boodstapped'), ['LazyLoadingApp']);
}
prm.add_endRequest(EndRequestHandler);
});
然后,当您尝试进行部分回发时,EndRequestHandler将再次引导应用程序。重要的是要删除以前的引导元素,以避免角度"已经引导"的错误。
单击此处了解更多信息。
虽然其他答案可能有效,但我发现最好的做法是尽量不要处于.net控件和角度控件的"混合"状态,这取决于两者之间的交互。
这一过程充其量是没有记录的。。。你最终会写很多代码来适应简单的事情。
我不建议长期执行以下操作,只建议将其作为临时/过渡解决方案,我知道这可能无法解决所有情况。。。。但请注意,你总是可以从dot.net方面攻击这个问题,如下所示,并重定向回你所在的页面…
protected void cbChecked_My_DotNet_CallBack(object sender, EventArgs e)
{
DoDotNetStuff();
if(NeedToSignalToAngular){
response.redirect(yourpage.aspx?yourparams=xxx)
}
}
- 在ejs-partial中对JSON对象进行迭代
- 更新面板PostBack中的RegisterClientScriptBlock
- {{outlet}}、{{yield}、}{render}和{{partial}的ember帮助程序之间存在差异
- Javascript在Postback期间检测
- Postback与Javascript客户端计算
- 将Javascript变量插入到Html.Partial ViewDataDictionary ASP.NET MVC中
- Postback后保持可折叠潜水打开
- 基于使用的ASP MVC EditorFor/Partial模板添加JavaScript引用
- 具有两种不同特性的车把.helper或partial
- 如何使用jQuery UI对话框在确认后触发LinkButton Postback
- Ajax,Php-Postback仅适用于Firefox
- 在Postback上保留动态内容
- 单击不相关的按钮时,PostBack OnTextChanged将触发
- Partial state changes for Vaadin's AbstractJavascriptCom
- 在带有Partial视图的MVC 5中,将提交按钮移动到表单外部
- 从JavaScript触发服务器端电子邮件,无需Postback
- Javascript in partial (Ruby on Rails)
- AngularJS ng include partial在$http拦截器中不可用
- Angular template and .NET Partial Postback
- 在Microsoft AJAX Partial Postback上向脚本管理器添加脚本引用(JavaScript)