2014-09-03 62 views
5

我無法使用.Net部分回傳進行角處理。角模板和.NET部分回傳

問題是基本上相同此:Re-initialize Angular bindings after partial postback

基本上我有在其上我有角應用一個標籤,然後我有一些C#控制第二個選項卡,我必須做的翼片,當我之間部分回發回到我的應用程序,沒有什麼。

我已經嘗試使用ngView進行路由,然後我嘗試了$route.reload()(它進入控制器,我可以看到模板正在被拉下來,但頁面上的結果是沒有的)。然後我嘗試compile(templateCache.get(lazyTableControllerRoute.current.templateUrl))(scope)如提到here。沒有。

請幫助:)

每次回發我頁面上把這個網站後:

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 

UPDATE:

我與require.js努力。(再次,它的工作後,滿頁面加載。)我的想法是引導元部分回傳後。 我構建了簡單的測試用例,在更新面板中隨着我的應用程序有一個簡單的按鈕,只是部分回發。點擊(當應用程序消失)之後,我試着在控制檯:

angular.bootstrap(document, ['LazyLoadingApp']) 

但後來我得到了錯誤,我無法刪除:

App Already Bootstrapped with this Element 'document' 

這裏是plunker在require.js方式的應用程序(但請保留記住它只是用於代碼審查的目的..)

回答

0
  • 不要同時使用ng-app和angular.bootstrap。
  • 你是否編譯過「ng-app」,如果沒有的話。

ngtutorial.com/learn/bootstrap

+0

謝謝你的回答。我沒有使用它,當我嘗試「require.js的方式」我沒有刪除ng-app標籤。 – 2014-09-04 11:20:56

+0

lazycontrol如何使用?爲什麼它包含ng-app? – 2014-09-04 11:22:35

+0

你可以在這裏看到,lazycontrol包含ng-app,因爲那是我的第一個方法 - 正常的角度注入。 請不要更新本身連接代碼上面的「UPDATE」,因爲我做了一些修改爲require.js工作 - 就像從頁面移除NG-app並添加ngview .. – 2014-09-04 11:27:57

0

好吧!問題解決了。所以爲了與部分回發到工作,你需要:

定義的應用程序是這樣的:(!記住,你必須從HTML刪除NG-APP)

<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將再次引導應用程序。刪除以前的引導程序元素非常重要,以避免角度「已引導」錯誤。

點擊Here以獲取更多信息。

0

雖然其他答案可能做的工作我發現,行動最好的辦法是儘量不要在.NET控件和角度控制依賴於兩者之間相互作用的「混合」狀態。

這個過程被無證充其量......你寫出來了大量的代碼,以適應簡單的事情。

我不建議做長期以下,僅建議其作爲臨時/過渡性解決方案,我知道這也許不能解決所有情況下....但要注意,你總是可以從dot.net攻擊這個問題一邊如下,並重新回到你所在的頁面...

 protected void cbChecked_My_DotNet_CallBack(object sender, EventArgs e) 
     { 
      DoDotNetStuff(); 
      if(NeedToSignalToAngular){ 
        response.redirect(yourpage.aspx?yourparams=xxx)  
      } 
     }