【问题标题】:Ng-init via functionng-init 通过函数
【发布时间】:2013-12-16 05:09:40
【问题描述】:

如您所知,可以按如下方式初始化对象:

<div ng-init="friends = [{name:'John', phone:'555-1276'},
                         {name:'Mary', phone:'800-BIG-MARY'},
                         {name:'Mike', phone:'555-4321'},
                         {name:'Adam', phone:'555-5678'},
                         {name:'Julie', phone:'555-8765'},
                         {name:'Juliette', phone:'555-5678'}]"></div>

是否可以通过函数来​​定义类似的对象:

<div ng-init="init()">

我的目标实际上是从 API 中获取对象并通过 ng-repeat 将它们显示在列表中

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-ng-init


    【解决方案1】:

    documentation 表示ng-init 将采用任何表达式。所以是的,只要相关范围定义了一个名为init() 的函数,您就可以在上面做您想做的事情(我也验证了它是为了好玩)。

    请注意,文档中说 ng-init 实际上仅用于为 ng-repeat 内的属性设置别名:

    ngInit 的唯一适当用途是为 ngRepeat,如下面的演示所示。除了这种情况,你应该使用 控制器而不是 ngInit 来初始化作用域上的值。

    最后,请注意,您可以在创建控制器时简单地初始化变量。所以根本没有必要使用ng-init。例如:

    var myApp = angular.module('myApp', []);
    
    myApp.controller('myController', ['$scope', function($scope){
    
      $scope.init = function() {
        $scope.a = 'Apples';
        $scope.b = 'Bees';
        $scope.c = 'Zebras';
      };
      // runs once per controller instantiation
      $scope.init();
    
    }]);
    

    【讨论】:

    • 这对我不起作用。我做了同样的事情。我的 UI 表单有 ng 模型,如 object.a、object.b 等......在我的控制器中,我有一个 init 函数,我有 $scope.object.a='myValue', $scope.object.b=' myValue'等。它说,它找不到属性a。我在这里错过了什么?
    • @SandeepAllampalli 很难说没有看到你的代码。但如果我猜的话,您可能需要初始化$scope.object,然后再尝试在$scope.object.a 上设置值。 $scope.object = {}; $scope.object.a = 'myValue';$scope.object = { a: 'myValue', b: 'myValue' };
    • 对,我后来意识到了,a把它定义为json格式,比如$scope.object = { a: 'myValue', b: 'myValue' };它运行良好:) 感谢您的回复!
    • 也许如果他们重命名这个 ng-alias... 或 ng-assign... 会有所帮助,他们将其命名为用于他们告诉开发人员不要使用它的确切用途...收到混合消息大声笑
    • 我使用 ng-init 对每个项目进行简单的计算,例如,显示人名我使用了一个函数,所以它的代码更简洁......
    【解决方案2】:

    所以根本不需要使用 ng-init

    有时您希望通过在视图中传递数据来初始化某些东西,这可能在模板化页面(例如 .NET MVC)中使用,您希望将信息从 .NET 传递到 Angular(控制器已经拥有数据和最简单的方法是在 ViewBag 中传递它)。

    要做到这一点,“正确”的方式是迂回的,并且难以维护,因为您必须在页面上嵌入一个具有固定 ID 的脚本标签,并再次使用 javascript/jquery 将数据拉入控制器中的范围使用硬编码的 ID。

    无论哪种方式都会打破(好吧,kludges)角度的 MVW 模式,所以,我猜,选择你的毒药。

    【讨论】:

    • 也许我应该说“所以根本不需要使用ng-init”更好。在他们的情况下,OP 不需要使用 ng-init
    • 当我想从服务器加载常见的本地化文本字符串(数据验证、全局错误消息等)时,我还发现了ng-init 的一个用例。我不想将我的 PHP 文本数组复制到 JSON 文件并通过 XHR 单独加载它们,或者创建一个新的 PHP 控制器操作来单独返回文本。 Ng-init 似乎是一个很好的解决方案,可以使用我的 SPA 应用程序的框架一次加载文本,然后将这些文本存储到全局 i18n Angular 服务,因此它们在我的整个应用程序中都可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2016-07-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多