在标记中设置角度范围变量


95

一个简单的问题:如何在html中设置作用域值,以供控制器读取?

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

app.controller('MyController', function($scope) {
  console.log($scope.myVar);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app'>
  <div ng-controller="MyController" app-myVar="test">
    {{myVar}}
  </div>
</div>

JSFiddle:http : //jsfiddle.net/ncapito/YdQcX/


您最好创建一个指令来处理此问题。指令将封装:参数,该指令专用的控制器以及“ myMap”标记的模板。
伊恩·默瑟

那实际上就是我所做的……在指令控制器中访问$ scope.myVar时遇到一些问题。为什么必须在控制器中使用监视来访问范围变量?
Nix

1
也许您可以发布指令?在docs.angularjs.org/guide/directive上查看“了解包含和作用域”。 您可能需要作用域:{myVar:'='},my-var="foo"当您调用它时会说。注意连字符和驼峰使用情况。注意:如果您不希望在范围定义中使用'@'来访问属性的值,foo此处进行评估
伊恩·默瑟

1
@Nix您能解释为什么需要在视图中而不是在控制器中初始化值吗?我假设您已经知道这不是初始化值的常规方法(否则您不会问),并且其他人如果能够更好地理解您的用例,将能够为您提供更好的答案。
肖恩·比恩

1
@SeantheBean我很小又很愚蠢...;)我不知道为什么我需要这么做。我可能正在尝试破解某些东西。
尼克斯

Answers:


139

ng-init在循环内分配变量时不起作用。用 {{myVariable=whatever;""}}

尾随会""停止对任何文本求值的Angular表达式。

然后,您可以简单地调用{{myVariable}}以输出变量值。

我发现在迭代多个嵌套数组时这非常有用,我想将当前的迭代信息保留在一个变量中,而不是多次查询。


1
尽管此方法有效,但似乎很hack。也就是说,通常的好习惯是{{}}仅用于输出单个变量,而不用于分配变量。我会说stackoverflow.com/a/16799763/814160更正确(视图中的JS代码更少)。
肖恩·宾恩

1
@SeantheBean +1-我已经测试过了。子控制器和在标记中分配变量的范围似乎存在问题。该指令适用于我的目的,似乎是一个可靠的解决方案。
保罗·卡尔顿

2
这似乎在angular2 / 4中不起作用-绑定不能包含分配
-Demodave

1
@Demodave您应该改为在Typescript代码中设置所有控制器变量,并仅使用模板将Typescript连接到HTML。该模板不应分配变量。
boxmein

81

ngInit 可以帮助初始化变量。

<div ng-app='app'>
    <div ng-controller="MyController" ng-init="myVar='test'">
        {{myVar}}
    </div>
</div>

jsfiddle示例


3
应该注意的是,他们不建议针对实际应用使用此解决方案(但并没有真正建议替代方案):docs.angularjs.org/guide/dev_guide.mvc.understanding_model
Mike Robinson

这对我有用,但是,起初该变量在控制器中仍未定义。我做了一个小小的间隔循环:var interval = setInterval(function(){if($ scope.whatever){// dostuff clearInterval(interval);}},10);
roelleor 2015年

19

创建一个名为指令myVar

scope : { myVar: '@' }

并这样称呼它:

<div name="my_map" my-var="Richmond,VA">

请特别注意指令中的驼峰引用对连字符标签名称的引用。

有关更多信息,请参见此处的“了解包含和作用域”:-http: //docs.angularjs.org/guide/directive

这是一个小提琴,它显示了如何在指令中以各种不同的方式将值从属性复制到作用域变量。


我希望能够做多个var-nick='my' var-nick2='test'。除非您能想到使用指令来实现它的方法,否则我将使用它ng-init
Nix

您可以在范围中包括多个属性,您所需要的只是使其中一个成为您要执行的指令的名称(或者在html中也包含该指令的名称)。 scope: {varNick: '@', varNick2: '@'}
伊恩·默瑟2013年

但是它不能扩展吗?我必须为每个变量定义一个指令吗?
Nix

不,您不需要每个变量的指令。看看我添加到答案中的小提琴。
伊恩·默瑟2013年

抱歉,我错过了阅读,您的例子很完美,我唯一的更改是scope {'@':'@“}
。– Nix

10

您可以像这样从html设置值。我认为从角度来看还没有直接的解决方案。

 <div style="visibility: hidden;">{{activeTitle='home'}}</div>

7
不错的技巧... <div style="display: none">但是会推荐。
罗杰

3

您可以ng-init如下所示使用

<div class="TotalForm">
  <label>B/W Print Total</label>
  <div ng-init="{{BWCount=(oMachineAccounts|sumByKey:'BWCOUNT')}}">{{BWCount}}</div>
</div>
<div class="TotalForm">
  <label>Color Print Total</label>
  <div ng-init="{{ColorCount=(oMachineAccounts|sumByKey:'COLORCOUNT')}}">{{ColorCount}}</div>
</div>

然后在其他部分中使用局部作用域变量:

<div>Total: BW: {{BWCount}}</div>
<div>Total: COLOR: {{ColorCount}}</div>

我喜欢这种方法;似乎不那么hacky。不过需要澄清的是,ng-init不需要花括号。
mklbtz

1
$scope.$watch('myVar', function (newValue, oldValue) {
        if (typeof (newValue) !== 'undefined') {
            $scope.someothervar= newValue;
//or get some data
            getData();
        }


    }, true);

变量在控制器之后初始化,因此您需要监视它,并且在未初始化时使用它。


0

我喜欢答案,但我认为最好创建一个全局范围函数,该函数将允许您设置所需的范围变量。

所以在globalController中创建

$scope.setScopeVariable = function(variable, value){
    $scope[variable] = value;
}

然后在您的html文件中调用它

{{setScopeVariable('myVar', 'whatever')}}

然后,这将允许您在各自的控制器中使用$ scope.myVar


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.