2014-10-30 2 views
0

Моя проблема: у меня есть объект продукта следующим образом: {id: 1, category: 'Television', price: '$2000',...}, затем создаю директиву product. Пользователь может купить продукт с помощью функции product scope buy(quantity). Но у меня много продуктов, создайте область с этой функцией, чтобы каждый продукт мог быть пустой памятью? Должен ли я создать дополнительную директиву, productBuyer имеет способ: buy(product, quantity), затем product директива require: '^productBuyer' будет помещена в нее? Какой дизайн лучше, когда масштабы применения? Или еще лучше?AngularJS: один или несколько директив?

Подробнее: Я не ставил buy на заводе, потому что product должен отображать сообщение об ошибке, если ошибка покупки (по многим причинам: устаревший продукт, товар-склад пуст, не доставляйте его пользователю. ..), этот метод процесса передается в директиву product.

+0

У вас будут продукты 100K-1M, отображаемые на одной странице? Нет? Затем перестаньте беспокоиться о пустой памяти. –

+0

@NewDev: спасибо за ваш комментарий. О шаблоне проектирования, используйте одну директиву лучше? – Pew

+0

Я не обязательно думаю, что использование директивы, которая «покупает» продукт, который он представляет, является хорошей идеей. Директивы - это автономные и многоразовые биты функциональности. Они могут подключиться к службе, но что-то вроде покупки продукта, ваше приложение, скорее всего, будет задействовано (например, тележка, проверка и т. Д.). Вы можете определенно прикрепить кнопку «купить» к каждой директиве, но я бы поставил функцию покупки на контроллер. –

ответ

1

Я бы ограничил использование директив автономными и многоразовыми битами функциональности. В вашем примере добавьте общие функции в директиву, но сохраните функциональность, связанную с более широким приложением в контроллере представления, а не в директиве.

app.js

angular.module("myApp", []). 
.controller("shoppingCtrl", function($scope, productSvc){ 
    productSvc.getProducts() 
    .then(function(products){ 
     $scope.products = products; 
    }); 

    $scope.buyProduct = function(product){ 
     productSvc.buy(product) 
     .then(function(){ /* do something */ }); 
    } 
}) 
.directive("product", function(){ 
    return { 
     restrict: "EA", 
     scope: { 
     product: "=", 
     onBuy: "&" 
     }, 
     templateUrl: "productDirective.html", 
     controller: function($scope){ 
     $scope.clickOnBuy = function(){ 
      $scope.onBuy(); 
     } 
     } 
    }; 
}); 

productDirective.html

<div> 
    <div>{{product.title}}</div> 
    <div>{{product.price}}</div> 
    <button ng-click="clickOnBuy()">Buy</button> 
</div> 

index.html

Наконец, в вашем HTML вы можете сделать:

<div ng-controller="shoppingCtrl"> 
    <div ng-repeat="item in products" product="item" on-buy="buyProduct(item)"></div> 
    <hr/> 
</div> 
+0

Прохладный!Теперь у меня другая проблема. Если я не передаю функцию 'onBuy', я не хочу отображать кнопку« Купить ». Как я могу это сделать? – Pew

+0

Добавьте 'ng-if =" onBuy "' к кнопке buy. Он будет отображать кнопку, если 'onBuy' определен –

+0

Nice. Большое спасибо! – Pew

Смежные вопросы