角度ng-click事件

时间:2014-06-05 07:59:13

标签: javascript angularjs

我有这些功能:

$scope.addProduct = function($event, obj) {

    var myEl = angular.element($event.target);

    myEl.parent().html('<button class="btn btn-danger btn-xs" ng-click="removeProduct('+ obj.id +')">Remove from Widget</button>');

};

$scope.removeProduct = function(id) {
    console.log('Remove ->' + id);

};

当我点击“addProduct”时,它可以工作,但是当我点击“removeProduct”时不起作用。看起来它没有听我点击我添加的新按钮。我该如何解决?

3 个答案:

答案 0 :(得分:1)

要使ngClick生效,您需要首先编译HTML并将其链接到$scope

.controller('someCtrl', function ($compile, $scope) {
    ...

    $scope.addProduct = function($event, obj) {
        var myEl = angular.element($event.target);
        var myBtn = $compile('<button class="btn btn-danger btn-xs" ng-click="removeProduct('+ obj.id +')">Remove from Widget</button>')($scope);
        myEl.after(myBtn);
    };

    $scope.removeProduct = function(id) {
        console.log('Remove ->' + id);
    };
});

<强>更新

Kos Prov's comment 是非常正确的 - 有时您会考虑解决问题,但您认为问题首先不是错误的。

所以,当然操纵DOM应该是指令的责任,所以我创建了一个指令来做你想要的(根据你的问题):

app.directive('removableProduct',function($ compile){         var btnTmpl =             ''+                 '从Widget中移除'+             '';

    return {
        restrict: 'A',
        scope: {item: '='},
        template: '<div ng-click="addProduct($event)">{{item.description}}</div>',
        controller: function ($scope) {
            $scope.addProduct = function (evt) {
                var myEl = angular.element(evt.target);
                var myBtn = $compile(btnTmpl)($scope);
                myEl.after(myBtn);
            };
            $scope.removeProduct = function(id) {
                console.log('Remove -> ' + id);
            };
        }
    };
});

另请参阅此 short demo

答案 1 :(得分:0)

如果以Angular方式执行此操作,则存在不存在的问题。

对于每个产品,尝试保持一个布尔值,例如&quot; productAdded&#39;在你的$ scope模型中。

然后你可以做例子:

<div ng-repeat="product in products">
    <button ng-show="product.productAdded" class="btn btn-danger btn-xs" ng-click="addProduct(product)">Add to Widget</button>
    <button ng-show="!product.productAdded" class="btn btn-danger btn-xs" ng-click="removeProduct(product.id)">Remove from Widget</button>
</div>

希望这能为你澄清一点!

答案 2 :(得分:0)

如果要在添加产品后添加删除按钮,则应在ng-repeat本身中添加删除按钮:

<强> JS

<div ng-app="app" ng-controller="ctrl">
   <ul>
      <li ng-repeat="product in products">
           {{product.name }}<button ng-click="deleteProduct(product)">Delete</button>
      </li>
   </ul>
</div>

<强>控制器

var app = angular.module('app', []);
app.controller('ctrl', function($scope) {
    $scope.products = [{ name:'pencil' }, { name: 'crayon' }, { name: 'pen' }];
    $scope.deleteProduct = function(product) {
        var index = $scope.products.indexOf(product);
        if (index >=0) {
            // remove the product
            $scope.products.splice(index, 1);
        }
    }
});