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

时间:2012-07-28 18:07:31

标签: javascript javascript-framework angularjs

我是AngularJS 的新手,就像我目前所见,尤其是模型/视图绑定。我想利用它来构建一个简单的“添加到篮子”功能。

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

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

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

        ...

    };
}

这是我的HTML:

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

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

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

3 个答案:

答案 0 :(得分:86)

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

<div ng-init="param='value';">
    <div ng-controller="BasketController" >
        <label>param: {{value}}</label>
    </div>
</div>  

该参数将在您的控制器范围内可用:

function BasketController($scope) {
        console.log($scope.param);
}

答案 1 :(得分: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;    
}

答案 2 :(得分:2)

我在AngularJS中不是很先进,但我的解决方案是使用一个简单的JS类来为你的购物车(在咖啡脚本意义上)扩展数组。

AngularJS的优点在于你可以通过ng-click传递给你“模型”对象,如下所示。

我不明白使用工厂的优势,因为我觉得它不像CoffeeScript类那么漂亮。

我的解决方案可以在服务中进行转换,以实现可重用的目的。但除此之外,我认为使用工厂或服务等工具没有任何优势。

class Basket extends Array
  constructor: ->

  add: (item) ->
    @push(item)

  remove: (item) ->
    index = @indexOf(item)
    @.splice(index, 1)

  contains: (item) ->
    @indexOf(item) isnt -1

  indexOf: (item) ->
    indexOf = -1
    @.forEach (stored_item, index) ->
      if (item.id is stored_item.id)
        indexOf = index
    return indexOf

然后在控制器中初始化它并为该操作创建一个函数:

 $scope.basket = new Basket()
 $scope.addItemToBasket = (item) ->
   $scope.basket.add(item)

最后你设置一个ng-click到一个锚点,在这里你传递你的对象(从数据库中作为JSON对象检索)到函数:

li ng-repeat="item in items"
  a href="#" ng-click="addItemToBasket(item)"