Ng-click góc với lệnh gọi đến một chức năng điều khiển không hoạt động


76

Tôi cần chuyển một biến cho một bộ điều khiển khác. Tôi có mã sau liên quan đến ListCtrl:

<a href="#items" data-router="article" ng-click="changeListName('metro')">

Liên kết sẽ đến một bộ điều khiển khác, ItemCtrl.

Tôi muốn chuyển một biến cho ItemCtrl. Tôi đã nghĩ đến việc sử dụng một dịch vụ có tên là SharedProperties:

service('sharedProperties', function () {
    var list_name = '';

    return {
        getListName: function() {
            return list_name;
        },
        setListName: function(name) {
            list_name = name;
        }
    };
});

Khi liên kết được nhấp, tôi gọi sự kiện nhấp chuột theo góc để kích hoạt chức năng sau:

$scope.changeListName = function(name) {
    sharedProperties.setListName(name);
};

Tuy nhiên, ng-click dường như không thay đổi giá trị tài sản chung của tôi ...

CẬP NHẬT

Tôi đặt một cảnh báo bên trong chức năng được kích hoạt bởi ng-click và cảnh báo được kích hoạt, đúng như vậy.

Tuy nhiên, khi tôi viết hàm của mình như thế này:

$scope.changeListName = function(name) {
    sharedProperties.setListName(name);
};

Nó không hoạt động ... có vẻ như 'sharedProperties.setListName (name);' không được thực thi ...

Nếu tôi đặt nó bên ngoài hàm với một tên giả (ví dụ: metro), nó hoạt động ..

CẬP NHẬT 3

Tôi đã thử nhiều thứ và tôi khá tự tin rằng vấn đề là với chức năng này:

$scope.changeListName = function(list_name) {
    sharedProperties.setListName(list_name);
};

Bạn có biết tại sao điều này lại xảy ra không?

Câu trả lời:


105

Bạn có thể nên sử dụng chỉ thị ngHref cùng với ngClick:

 <a ng-href='#here' ng-click='go()' >click me</a>

Đây là một ví dụ: http://plnkr.co/edit/FSH0tP0YBFeGwjIhKBSx?p=preview

<body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    {{msg}}
    <a ng-href='#here' ng-click='go()' >click me</a>
    <div style='height:1000px'>

      <a id='here'></a>

    </div>
     <h1>here</h1>
  </body>

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

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';

  $scope.go = function() {

    $scope.msg = 'clicked';
  }
});

Tôi không biết liệu điều này có hoạt động với thư viện bạn đang sử dụng hay không nhưng ít nhất nó sẽ cho phép bạn liên kết và sử dụng chức năng ngClick.

** Cập nhật **

Đây là bản demo của bộ và hoạt động tốt với một dịch vụ.

http://plnkr.co/edit/FSH0tP0YBFeGwjIhKBSx?p=preview

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

app.controller('MainCtrl', function($scope, sharedProperties) {
  $scope.name = 'World';

  $scope.go = function(item) {
    sharedProperties.setListName(item);


  }

  $scope.getItem = function() {

    $scope.msg = sharedProperties.getListName();
  }
});

app.service('sharedProperties', function () {
    var list_name = '';

    return {

        getListName: function() {
            return list_name;
        },
        setListName: function(name) {
            list_name = name;
        }
    };


});

* Biên tập *

Vui lòng xem lại https://github.com/centralway/lungo-angular-bridge nói về cách sử dụng lungo và angle. Cũng lưu ý rằng nếu trang của bạn đang tải lại hoàn toàn khi duyệt đến một liên kết khác, bạn sẽ cần duy trì các thuộc tính được chia sẻ của mình vào localstorage và / hoặc cookie.


Có vẻ như với cả hai ng-refhref, ng-clickđược kích hoạt và kích hoạt chức năng của tôi. Tôi đã cập nhật câu trả lời của mình để phản ánh vấn đề của tôi tốt hơn.
Justin D.

Bạn đang hỏi một câu hỏi riêng biệt bây giờ?
lucuma

Tôi đã sửa đổi plunker của mình với dịch vụ của bạn và nó hoạt động tốt. Tôi nghi ngờ bạn có một số vấn đề khác đang xảy ra. Bạn sẽ thấy văn bản cập nhật liên kết dịch vụ Nhận biểu mẫu với giá trị từ dịch vụ.
lucuma

Tôi thấy nó hoạt động tốt trong jsfiddle. Bạn có biết tại sao nó không hoạt động trong ứng dụng của tôi không?
Justin D.

Tôi đã tìm thấy nguồn gốc của lỗi. Nó đến từ bộ điều khiển thứ hai của tôi. phương thức sharedProperties.getListName () trả về một chuỗi trống, mặc dù bộ điều khiển đầu tiên đã đặt chuỗi thành 'metro' trong ví dụ của tôi. Tôi đã sao chép hành vi ở đây plnkr.co/edit/FSH0tP0YBFeGwjIhKBSx?p=preview
Justin D.

4

Sử dụng bí danh khi xác định Bộ điều khiển trong cấu hình góc của bạn. Ví dụ: LƯU Ý: Tôi đang sử dụng TypeScript ở đây

Chỉ cần lưu ý đến Bộ điều khiển, nó có bí danh là homeCtrl.

module MongoAngular {
    var app = angular.module('mongoAngular', ['ngResource', 'ngRoute','restangular']);

    app.config([
        '$routeProvider', ($routeProvider: ng.route.IRouteProvider) => {
            $routeProvider
                .when('/Home', {
                    templateUrl: '/PartialViews/Home/home.html',
                    controller: 'HomeController as homeCtrl'
                })
                .otherwise({ redirectTo: '/Home' });
        }])
        .config(['RestangularProvider', (restangularProvider: restangular.IProvider) => {
        restangularProvider.setBaseUrl('/api');
    }]);
} 

Và đây là cách để sử dụng nó ...

ng-click="homeCtrl.addCustomer(customer)"

Hãy thử nó .. Nó có thể hiệu quả với bạn cũng như nó hiệu quả với tôi ...;)


3

Tôi đoán rằng bạn không nhận được lỗi hoặc bạn sẽ đề cập đến chúng. Nếu đúng như vậy, hãy thử xóa hrefgiá trị thuộc tính để trang không điều hướng đi trước khi mã của bạn được thực thi. Trong Angular, việc để hreftrống các thuộc tính là hoàn toàn có thể chấp nhận được .

<a href="" data-router="article" ng-click="changeListName('metro')">

Ngoài ra, tôi không biết những gì data-routerđang làm nhưng nếu bạn vẫn không nhận được kết quả thích hợp, đó có thể là lý do tại sao.


Bộ định tuyến dữ liệu dành cho Lungo js. Nó có hệ thống định tuyến riêng. Tôi không thể xóa href vì sau đó lungo sẽ không biết phải định tuyến ở đâu ...
Justin D.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.