【问题标题】:AngularJS and embedded framework htmlAngularJS 和嵌入式框架 html
【发布时间】:2012-06-13 23:44:24
【问题描述】:

我正在开发一个用户偏好页面,我决定使用 AngularJS 来控制数据的状态。

我想要实现的是一个显示当前用户设置并允许用户编辑、取消更改或保存并提交更改(如果他们愿意)的页面。我已将我的标签和输入控件绑定到模型,以便当用户修改他们的电子邮件地址时,它会正确反映。

顺便说一下,我的工作基于这个示例 #3:http://code.angularjs.org/1.0.0rc12/docs-1.0.0rc12/guide/forms

我的问题与页面的默认值有关。由于模型在 Javascript 中被定义为对象。在上面的链接中,可以在$scope.master= {}; 中设置默认值,除了我使用框架生成静态页面而不是从我的服务器检索 json 对象外,它工作正常。我的页面都是用嵌入式 scala 编写的,所以我访问了服务器端的值。获取服务器端检索到的信息并将其转换为客户端 javascript 可以访问的对象的最佳方法是什么?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    你有几个选择。我这样做的方式是将初始状态(通过 WebSocket 或其他东西)作为 JSON 推送到 Angular,或者让 Angular 通过 HTTP 调用从服务器中提取它。

    您也可以使用 ng-init 标签来渲染页面以设置初始状态,但这种方式对我来说似乎很奇怪。

    <div ng-controller="FormController" ng-init="formData = {}">
      <form>
         <input ng-model="formData.input1" ng-init="formData.input1 = 'initialValue'>
      </form>
    </div>
    

    【讨论】:

    • ng-init 应该对我有用。最终,我将把一切都转移到使用 AJAX 并通过单独的 HTTP 调用检索数据;我们只是在一个非常紧张的时间表上,不想让事情复杂化。 :)
    • 我不确定 AngularJS 文档是否建议不要使用 ng-init:docs.angularjs.org/guide/dev_guide.mvc.understanding_model 他们没有提供理由,但建议仅将其用于示例应用程序而不是在生产环境中。
    【解决方案2】:

    我正在使用 ASP.NET 和 Dapper-Dot-Net。我使用以下技术将我的数据放到页面上,然后进入 Angular 范围。它应该可以很好地转移到您的环境中。

    1. 在服务器端的页面中定义一个 DataTransferObject 类和一个名为 DtoJson 的公共字符串来保存您的类实例的序列化版本。

      private class DataTransferObject{
        public User User;
        public List<Project> Projects
      }
      
      public string DtoJson;
      
      var dto=new DataTransferObject();
      var userName="however you get a username";
      dto.User=User.Get(userName);  // I already have a User class
      var sql="select * from projects where user_name=:UserName";
      var p=new DynamicParameters();
      p.Add(":UserId", dto.User.ID);
      dto.Projects=Project.Query<Project>(sql, p);  // returns a list of Project
      
      // I use json.net to convert the Dto to json and expose it as a public variable
      var DtoJson=Json.Convert(dto);  // approximate syntax but you get the idea
      
    2. 在客户端,我在页面顶部放置了一个脚本标签,并将 DtoJson 注入其中以使其进入全局范围

      <script>var dto=<%=DtoJson%>;</script>
      
    3. 在我的页面底部我有一个脚本 src="pageName.js" 这是我的 Angular 控制器文件。我说的控制器内部

      $scope.dto=dto;
      console.log($scope.dto);
      
    4. 现在,在服务器端创建的 json 在我的控制器范围内,我可以将数据绑定到 {{dto.User.FIRST_NAME}} 和 {{dto.Projects[0].ID}} ng -repeat="for p in dto.Projects" 等

    我希望这是有道理的。

    彼得

    【讨论】:

    • 感谢彼得的评论。解释完全有道理,是我考虑这样做的方式之一。角度文档提到不建议将上述 ng-init 解决方案用于生产应用程序,但没有提及原因。您的解决方案对我来说似乎是一种同样有效的方法,尽管我想避免创建内联变量(主要是出于样式目的)。类似的东西应该很容易在 Scala/Play 世界中实现。
    • 内联变量有点难看,我同意。也许更好的方法是创建一个服务并将其注入控制器。
    猜你喜欢
    • 2022-07-28
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2011-12-23
    • 2010-09-25
    相关资源
    最近更新 更多