所以我正在为一个预先存在的 Rails 应用程序编写一个 Angular 前端。我知道在将后端转换为通过 JSON 将 REST Api 直接提供给 ngResource 之前,使用 $q 充其量只是一个中间步骤,但不幸的是,目前在各种 Ruby 位置中存在太多逻辑,无法轻松地将所有内容重写为纯 Angular 格式。
问题是,我如何正确实例化和处理返回的部分中的 ng 属性。以下是经过净化的代码版本。
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 正在页面上正确显示,并且日期选择器正在成功实例化。返回的 HAML 的第一行是:
= form_for @type, :html=>{:class=>'form-horizontal type-form', :"ng-submit"=>"validateForm($event);"} do |f|
有趣的旁注:将 ng-attributes 放在 HAML 中的原始 DOM 元素上就像一个魅力。例子:
= 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'))")
同样没有任何有用的事情发生。
关于如何解决这个问题的任何建议?附带说明:稍后在返回的部分中,还有另一个带有 ng-controller 的元素。不用说有用的事情不会发生在它身上。
编辑: HAML 实际上并没有被原始返回,而是通过以下 js.erb 路由:
$('div.form_<%= @artifact.id %>').replaceWith("<%=j render 'form' %>");
然后返回表单部分。