0

我正在使用带有 Rails 的 AngularJS 并创建未在 AngularJS 范围内注册的动态嵌套表单项。他们被分配了“ng-dirty”类。

我有一个投资者,他有三间房子,在我的 Angular 控制器中,我只分配前 2 间,因为我真的想通过 Rails 设置它们。

$ (event) ->
  app = angular.module "investor", []

  app.controller("InvestorCtrl", ["$scope", ($scope) ->
    $scope.houses = [
      { cost: "295000", value: "450000" },
      { cost: "600000", value: "620000"  }    
    ]
    $scope.calc_totals = ->
      # Initialise variables
      cost = 0
      value = 0

      # Go through each house and calculate the total cost
      for h in $scope.houses
        cost = parseInt(cost) + parseInt(h.cost)
        value = parseInt(value) + parseInt(h.value)

      # Set the total
      $scope.total_cost = cost
      $scope.total_value = value  

    # Run the calculation at the start  
    # $scope.calc_totals()
  ])

  angular.bootstrap document, ['investor']

这是我的表格

%div{"ng-controller" => "InvestorCtrl"}
    = form_for(@investor) do |f|
        - if @investor.errors.any?
            #error_explanation
                %h2
                    = pluralize(@investor.errors.count, "error")
                    prohibited this investor from being saved:
                %ul
                    - @investor.errors.full_messages.each do |msg|
                        %li= msg
        .field
            = f.label :name
            = f.text_field :name, "ng-model" => "name"

        - i = 0
        = f.fields_for :houses do |builder|
            .field
                = render :partial => "house", :locals => {:f => builder, :i => i}
                - i = i + 1

        .field
            = f.label :total_cost
            = f.number_field :total_cost, "ng-model" => "total_cost"
        .field
            = f.label :total_value
            = f.number_field :total_value, "ng-model" => "total_value"
        .actions
            = f.submit

如果我输入第一个或第二个房子的“成本”或“价值”,那么它会更新总成本,但如果我更新第三个房子,它不会更新总成本。

有没有办法动态地告诉 angularjs 监听这些元素而不在控制器中分配它们?

4

1 回答 1

0

IMO,您实际上对此有点错误。由于 Angular 可以(并且将会)为您处理重复 HTML 的呈现,因此您不一定需要在服务器上进行 HTML 呈现。您从服务器中需要的只是一些 JSON。如果您希望立即渲染它,您只需确保在初始化控制器时正确设置初始值。

将 $http 或定制服务注入您的控制器,并以 JSON 格式直接从服务器中提取您想要的数据,然后将其插入您的范围。如果您的 HTML 和指令设置正确,它只会呈现。从那里所有其他逻辑将是相同的。

网络正在向前发展。向前,我的意思是你过去在服务器上做的所有 HTML 渲染工作实际上开始越来越多地在客户端上完成。您过去用来在 Web 服务器上获取数据的那个服务层呢?那么它现在你的网络服务器。

我知道这不是您问题的直接答案,但它将大大简化您尝试做的事情。否则你有一个平衡的行为要执行,这会很快让人抓狂。

于 2012-10-23T13:42:04.227 回答