将变量传递给AngularJS控制器,最佳实践?

Gre*_*reg 69 javascript javascript-framework angularjs

我是AngularJS的新手,就像我到目前为止看到的那样,特别是模型/视图绑定.我想利用它来构建一个简单的"添加到篮子"功能.

到目前为止这是我的控制器:

function BasketController($scope) {
    $scope.products = [];

    $scope.AddToBasket = function (Id, name, price, image) {

        ...

    };
}
Run Code Online (Sandbox Code Playgroud)

这是我的HTML:

<a ng-click="AddToBasket('237', 'Laptop', '499.95', '237.png')">Add to basket</a>
Run Code Online (Sandbox Code Playgroud)

现在这可行但我非常怀疑这是在我的模型中创建新产品对象的正确方法.然而,这是我完全缺乏AngularJS体验的地方.

如果不是这样做的话,最佳做法是什么?

And*_*ejs 86

你可以在外部div中使用ng-init:

<div ng-init="param='value';">
    <div ng-controller="BasketController" >
        <label>param: {{value}}</label>
    </div>
</div>  
Run Code Online (Sandbox Code Playgroud)

然后,该参数将在您的控制器范围内提供:

function BasketController($scope) {
        console.log($scope.param);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案现已弃用.正如[此类似答案](http://stackoverflow.com/a/14531643/135114)更新中所述,[ngInit的角度文档](https://docs.angularjs.org/api/ng/directive/ngInit)现在明确指出`ng-init`唯一被批准使用的是"别名ngRepeat的特殊属性"(例如`fooIndex = $ index`). (16认同)
  • 是.如果您愿意,可以在与`ng-controller`属性相同的元素上使用`ng-init`参数. (6认同)
  • 我在与ng-controller相同的元素上使用ng-init时遇到问题.这个改变了还是我做错了什么? (2认同)
  • @Daryn服务的"角度方式"是使用静态模板和REST API来实现动态内容.要获取数据,请发出HTTP请求并获取(通过其他请求).由于这可能是最佳实践,因此在许多情况下,页面是动态生成的.此外,如果您只使用AJAX加载数据,SEO可能是一个问题.所以我真的没有看到弃用`ng-init`指令的重点.我真的没有看到2种方法的替代品(除了一些自定义指令,它与`ng-init`几乎相同). (2认同)

And*_*lin 65

你可以创建一个篮子服务.通常在JS中,您使用对象而不是大量参数.

这是一个例子:http://jsfiddle.net/2MbZY/

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

app.factory('basket', function() {
    var items = [];
    var myBasketService = {};

    myBasketService.addItem = function(item) {
        items.push(item);
    };
    myBasketService.removeItem = function(item) {
        var index = items.indexOf(item);
        items.splice(index, 1);
    };
    myBasketService.items = function() {
        return items;
    };

    return myBasketService;
});

function MyCtrl($scope, basket) {
    $scope.newItem = {};
    $scope.basket = basket;    
}
Run Code Online (Sandbox Code Playgroud)

  • 这是有道理的 - 也只是教我如何做服务!尼斯.谢谢 - 但是如何创建然后将对象传递给控制器​​而不需要一系列HTML输入? (7认同)
  • 该方法的一个问题是单个实例被创建并且对于整个应用程序是相同的,因此对于特定页面子控制器,您可能最终会发生冲突或已经具有某些数据的服务.感觉就像拥有一个存储东西的全局. (3认同)