【问题标题】:How to initialize property in local scope when using AngularJS ng-repeat使用AngularJS ng-repeat时如何在本地范围内初始化属性
【发布时间】:2015-03-16 13:13:59
【问题描述】:

我有一个字符串列表和按钮,它们可以在本地范围内更改每个字符串的颜色属性。每个新添加的字符串都是黑色的,因为从 Controller 范围获取颜色属性。如何在新字符串的本地范围内初始化颜色属性?

这只是一个例子来说明我的问题。因此,在实际项目中,我无法将新属性添加到 List(例如 currentColor: 'Red')或其他内容。我只想知道:创建此范围时如何为本地范围内的属性设置值。

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

        MyApp.controller('MyController', function ($scope) {
            $scope.color = 'Black';
            $scope.list = [
                { text: 'text1' },
                { text: 'text2' },
                { text: 'text3' }
            ]

            $scope.AddNewText = function () {
                $scope.list.push({ text: 'text' + ($scope.list.length + 1) });
            }
        });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.9/angular.min.js"></script>
<div ng-app="MyApp">
        <div ng-controller="MyController">
            <div ng-repeat="item in list">
                <span style="color:{{color}}">{{item.text}}</span>
                <button data-ng-click="color = 'Red'">Red</button>
                <button data-ng-click="color = 'Green'">Green</button>
                <button data-ng-click="color = 'Blue'">Blue</button>
                <button data-ng-click="color = 'Black'">Black</button>
            </div>
            <button data-ng-click="AddNewText()">Add new text</button>
        </div>
    </div>

【问题讨论】:

  • 我不太明白这个问题。为什么每个项目没有自己的颜色?
  • 问题不清楚请详细说明...

标签: javascript angularjs angularjs-ng-repeat ng-repeat angularjs-ng-style


【解决方案1】:

仅使用ng-style 指令更改将处理颜色默认值的 html 行。

<span ng-style="{'color':color||'Black'}">{{item.text}}</span>

您的 html 将如下所示

<div ng-app="MyApp">
    <div ng-controller="MyController">
        <div ng-repeat="item in list"> 
            <span ng-style="{'color':color||'Black'}">{{item.text}}</span>
            <button data-ng-click="color = 'Red'">Red</button>
            <button data-ng-click="color = 'Green'">Green</button>
            <button data-ng-click="color = 'Blue'">Blue</button>
            <button data-ng-click="color = 'Black'">Black</button>
        </div>
        <button data-ng-click="AddNewText()">Add new text</button>
    </div>
</div>

无需从控制器设置任何颜色值。 Fiddle here

希望我能理解您的问题。谢谢。

【讨论】:

  • 很高兴为您提供帮助。谢谢 :)
【解决方案2】:

ng-repeat 创建它自己的代码。要初始化本地范围,您可以使用ng-init

<div ng-repeat="item in list" ng-init="color = 'red'">
     <span style="color:{{color}}">{{item.text}}</span>
</div>

【讨论】:

    【解决方案3】:

    使 $scope.list 成为一个包含文本和颜色的对象数组。

     $scope.list = [
                    { text: 'text1',color: 'black' },
                    { text: 'text2',color: 'black' },
                    { text: 'text3',color: 'black' }
                ]
    

    HTML:

            <span style="color:{{item.color}}">{{item.text}}</span>
                <button data-ng-click="item.color = 'Red'">Red</button>
    

    如果你想在没有列表的情况下进行初始化,你想使用 $watch。

    $scope.$watch('list', function() {
           $scope.color = 'black';
           console.log('list has changed, do whatever you want');
       });
    

    【讨论】:

    • 这是一个很好的解决方案。但是,在实际项目中,我不想向 List 添加任何其他属性。所以,我感兴趣是否有任何方法来初始化本地范围属性。如果没有这样的方法,我会使用你的解决方案。
    • 我添加了 $watch 来回答解决方案,它监听变量的变化。它可以在没有二维对象的情况下工作。
    猜你喜欢
    • 2019-10-14
    • 2018-08-12
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多