【问题标题】:Can I init an Angular ngModel in html, and then use its value in controller?我可以在 html 中初始化一个 Angular ngModel,然后在控制器中使用它的值吗?
【发布时间】:2015-03-31 21:07:36
【问题描述】:

html:

<div ng-controller="MyController">
<form>
<!-- one way to do it -->
<input ng-model="var1" value="1"></input> 
<!-- another way, not approved per angular documentation outside of ngRepeat -->
<input ng-model="var2" ng-init="var2=2"></input>
</form>
</div>

js:

angular.module('myApp', []);
angular.module('myApp')
    .controller('MyController', ['$scope', function ($scope) {
  console.log("value of var1 is " + $scope.var1);
  console.log("value of var2 is " + $scope.var2);
  $scope.var1 = 3;
  $scope.var2 = 4;
}]);

View this in jsbin

结果:

value of var1 is undefined
value of var2 is undefined
[setting values to 3 and 4 displays fine in inputs]

因此,控制器代码似乎在评估输入 ng-model 参数之前正在运行。这是有道理的,因为控制器比输入标签更早宣布。

问题:

有没有办法让控制器逻辑读取并尊重 var1 和 var2 的初始值?

【问题讨论】:

    标签: javascript html angularjs angular-ngmodel


    【解决方案1】:

    您不能混合使用 Angular 的 ng-model 和常规 HTML value 属性。

    如果要初始化模型,请在控制器中进行(或使用ng-init,但不推荐)。并从您的 HTML 中删除 value

    $scope.var1 = 3;
    $scope.var2 = 4;
    

    此外,ng-init 在首次读取控制器后进行评估,因此如果您想显示来自ng-init 的值,您需要为它使用$watch:它不会在您的控制器第一次出现时出现执行。

    【讨论】:

    • 嗯,所以如果我想在服务器端生成html和js时初始化模型,我必须以某种方式在js中这样做吗?就像制作一个返回一些预先生成的 json 的服务?
    • 我可以把值放在一个典型的数据属性中,然后使用 jquery/jqlite 读取它吗?
    • Angular 的整体理念是您不生成 HTML 服务器端。您使用服务器构建您的model(在控制器中)并让 HTML 相应地呈现到此模型。这是为了更好地分离关注点:服务器只提供信息,没有显示的概念。
    • @BenjaminWheeler 好的,所以我更好地理解了你的问题:如果你想从服务器生成的页面中获取初始值并且你不想使用 Ajax 来做到这一点,你确实可以把它在一些data 属性中,甚至保留value,然后读取它以初始化您的默认模型。不过这有点 hacky。
    • 不是我不想使用Ajax,而是我在生成页面的情况下,服务器知道要显示哪个项目,但客户端不知道。所以客户端不知道要哪个项目,如果服务器没有告诉它。我想正确的做法是重做 URL,使其成为实际的 Angular 路由并在其中包含项目 ID?
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2021-08-09
    • 2020-11-21
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多