所以我正在爲一個預先存在的Rails應用程序編寫一個Angular Frontend。我知道使用$ q充其量只是在將後端通過JSON直接提供給ngResource以將REST Api提供給ngResource之前的一箇中間步驟,但不幸的是,暫時存在太多邏輯駐留在各個Ruby位置以輕鬆地將所有內容都重寫爲純粹的Angular格式。
問題是,我如何正確實例化和處理返回的部分中的屬性。以下是代碼的消毒版本。
Company.Controller.TypeAccordionController = (scope, http, element, q, typeJQueryService) ->
scope.validateForm = (event) ->
console.log "we are here"
scope.getTheDamnType = (id) ->
typeJQueryService.multipart(id).then (response)->
angular.element('.datePicker').datepicker()
Company.Controller.TypeAccordionController.$inject = ['$scope', '$http', '$element', '$q','typeJQuery']
返回的HAML正在頁面上正確顯示,並且datepicker正在成功實例化。返回HAML的第一行是:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-submit"=>"validateForm($event);"} do |f|
有趣的旁註:把在HAML內生的DOM元素NG-屬性就像一個魅力。例如:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-controller"=>"someFormController"} do |f|
以上將無法使用。下面的作品一樣。然而魅力:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-controller"=>"someFormController"} do |f|
%div(ng-controller=someFormController)
服務做展示工程如下:
Company.MyModule.factory 'TypeJQuery', ($q, $rootScope) ->
multipart: (element) ->
deferred = $q.defer()
$.get "..." + element, (data) ->
$rootScope.$apply ->
deferred.resolve data
deferred.promise
然而,什麼都不會發生上提交,日誌不打印。另一種嘗試是:
scope.validateForm = (event) ->
console.log "we are here"
scope.getTheDamnType = (id) ->
typeJQueryService.multipart(id).then (response)->
angular.element('.datePicker').datepicker()
angular.element('form').attr("ng-submit", "validateForm($(this).attr('id'))")
Similiarly任何有用的事。
有關我如何解決這個問題的任何建議?在附註中:稍後在返回的部分中,有另一個元素帶有ng控制器。不用說有用的東西不會發生在它身上。
編輯:實際上沒有返回的HAML生,而是通過以下js.erb路由:
$('div.form_<%= @artifact.id %>').replaceWith("<%=j render 'form' %>");
然後返回的形式部分。
我知道這並不真正有幫助,但它看起來並不適合AngularJS,如果您需要在控制器中操作DOM,您將無法從Angular中獲益。如果你繼續使用angular:你不需要使用jQuery ajax,hou可以使用$ http服務 – Guillaume86
我意識到這一點,這是一個長期目標,這應該是一個排序中間步驟,這樣我們不必一次性重寫我們整個先前存在的Rails應用程序。 雖然謝謝。 –