角度js从默认值初始化模型

Cal*_*dge 126 angularjs

假设您有一个从数据库加载值的表单.你如何初始化ng模型?

例:

<input name="card[description]" ng-model="card.description" value="Visa-4242">
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,$ scope.card最初是未定义的.除了做这样的事情之外还有办法吗?

$scope.card = {
  description: $('myinput').val()
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cok 236

如果您无法修改您的应用程序以执行@blesh建议(使用$ http或$ resource拉下JSON数据并填充$ scope),则可以使用ng-init代替:

<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
Run Code Online (Sandbox Code Playgroud)

另请参阅AngularJS - 使用ng模型时,将忽略输入文本框中的Value属性?

  • +1,优雅!人们提倡快速和快速的行为,但SO的许多人说"做到所有客户端.",就像数百万的http呼叫对于活泼的网站是好的.将数据服务器端插入模板可启用缓存策略.使用Memcached静态或动态/部分.这就是推特所做的.有时候它很有用,有时则没有.想强调一下.只是补充说,不是你说的其他,@ Mark. (13认同)
  • 我正在将Angular与C#Web窗体配合使用,并且我发现使用ng-init在从代码隐藏/回发设置值中非常有用,例如,&lt;input name =“ phone” data-ng-model =“ frm.phone “ data-ng-init =” frm.phone ='&lt;%:Model.Phone%&gt;'“ data-ng-pattern =” / ^ [0-9()\-+] + $ /“ type =” tel “ required /&gt;`。有点丑吗?是的,但是可以解决问题,并解决了该过程中的集成难题。 (2认同)

Ben*_*esh 136

这是新Angular应用程序中的常见错误.如果可以避免,则不希望将值写入服务器上的HTML.事实上,如果你可以让你的服务器完全呈现HTML,那就更好了.

理想情况下,您希望发送Angular HTML模板,然后通过JSON中的$ http下拉您的值并将它们放在您的范围内.

所以如果可能的话,这样做:

app.controller('MyController', function($scope, $http) {
    $http.get('/getCardInfo.php', function(data) {
       $scope.card = data;
    });
});

<input type="text" ng-model="card.description" />
Run Code Online (Sandbox Code Playgroud)

如果您绝对必须将您的值从服务器呈现到HTML中,您可以将它们放在全局变量中并使用$ window访问它们:

在你的页面标题中你写出来:

<head>
   <script>
       window.card = { description: 'foo' };
   </script>
</head>
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中,你会得到它:

app.controller('MyController', function($scope, $window) {
   $scope.card = $window.card;
});
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助.

  • 不要感到震惊...... HTML的呈现正在逐渐脱离服务器和浏览器.目前,JavaScript中有许多MVC框架,对于服务器而言,将JSON/XML数据托管到JavaScript应用程序比在服务器上呈现每个页面要高效得多.它将大量工作抵消到客户端的计算机而不是让服务器受到攻击.更不用说它可以节省带宽.最重要的是,你可以拥有一个本机移动应用程序(或任何真正的),它通过HTTP消耗相同的JSON.这是未来. (125认同)
  • 我不同意这是一个"错误".在某些情况下,客户端呈现是最佳解决方案.在其他情况下,服务器端渲染是可行的方法.你可以使用两种技术的角度,客户端渲染不应该被视为"角度方式",因为它不是.Angular比这更灵活. (19认同)
  • @blesh,当然 - 任何搜索引擎优化都很重要的实例,但是爬虫的替代内容的成本高于使用嵌入式数据实现角度的成本 - 任何能够为感知速度或渲染时间提供高价值的应用程序用户体验 - 许多内容网站和电子商务网站都属于这些类别之一.twitter的工程师尝试了客户端渲染,然后又回到服务器上以提供更好的用户体验,他们也概述了他们的推理:https://blog.twitter.com/2012/improving-performance-twittercom (8认同)
  • 是的,它有帮助.我想Angular家伙做出这个决定我感到很震惊. (4认同)
  • @blesh:很棒的答案.非常感谢.我同意这是前进的方向,并且自己开始采用这种方法; 你有任何支持这种说法的链接吗?我还担心将html从服务器移植到客户端会导致页面加载时间变慢,尤其是在移动设备中,例如导航树可能会渲染大量HTML. (3认同)
  • @BenLesh,我正在使用$ http从我的Web服务获取AngularJs的值.但那是鸡和蛋的问题:使用$ http我需要向Angular代码提供我的Web服务的URL!我不想在Angular中对其进行硬编码,我的.NET代码从其配置中获取此URL,然后需要将其提供给AngularJS.那么,该怎么做?通过使用$ window访问它们的全局变量,正如你所说的那样?这看起来很难看.我想通过服务器(ASP.NET C#)代码提供的变量初始化Angular的优雅和标准方法. (2认同)

Kev*_*one 60

对于AngularJS来说,这显然是缺乏但很容易添加的修复.只需编写一个快速指令即可从输入字段设置模型值.

<input name="card[description]" value="Visa-4242" ng-model="card.description" ng-initial>
Run Code Online (Sandbox Code Playgroud)

这是我的版本:

var app = angular.module('forms', []);

app.directive('ngInitial', function() {
  return {
    restrict: 'A',
    controller: [
      '$scope', '$element', '$attrs', '$parse', function($scope, $element, $attrs, $parse) {
        var getter, setter, val;
        val = $attrs.ngInitial || $attrs.value;
        getter = $parse($attrs.ngModel);
        setter = getter.assign;
        setter($scope, val);
      }
    ]
  };
});
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!我刚刚添加了一个"修复",以使这也适用于textareas - https://gist.github.com/rmontgomery429/6191275 (3认同)

jto*_*mpl 12

恕我直言,最好的解决方案是@Kevin Stone指令,但我必须升级它才能在各种条件下工作(fe select,textarea),而且这个是有效的:

    angular.module('app').directive('ngInitial', function($parse) {
        return {
            restrict: "A",
            compile: function($element, $attrs) {
                var initialValue = $attrs.value || $element.val();
                return {
                    pre: function($scope, $element, $attrs) {
                        $parse($attrs.ngModel).assign($scope, initialValue);
                    }
                }
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)


use*_*240 7

您可以使用自定义指令(支持textarea,select,radio和checkbox),查看此博客文章https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- fields-attributes /.


kox*_*xon 6

您也可以在HTML代码中使用: ng-init="card.description = 12345"

Angular不推荐使用,如上所述,您应该只使用您的控制器.

但它的工作原理:)