angularjs: обновление $scope, когда я меняю выбор с помощью jQuery

Я использую плагин jQuery для «настройки» моего выбора.

Этот плагин запускает событие изменения исходного выбора, когда выбран какой-либо параметр.

Проблема в том, что мой объем не меняется.

Здесь вы можете увидеть быстрый пример... изменение выбора изменения области. нажатие кнопок меняет выбор, но не область действия.

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

Что мне не хватает?


person user2071887    schedule 07.08.2013    source источник


Ответы (5)


Вам нужно получить доступ к области раскрывающегося списка, а затем применить его, как показано ниже:

$('button').on('click', function(){
    var newVal = $(this).data('val');
    $('select').val(newVal).change();

    var scope = angular.element($("select")).scope();
    scope.$apply(function(){
        scope.selectValue = newVal;
    });
});
person AlwaysALearner    schedule 07.08.2013

Когда вы нажимаете кнопку, angular выходит за пределы своей области и использует jquery для управления данными/выполнения некоторых действий, поэтому нам нужно явным образом вызвать $scope.$apply(), чтобы отразить изменения обратно в область действия контроллера. И измените свой контроллер на это:

app.controller('AppCtrl', function($scope) {
    $('button').on('click', function(){
        $scope.selectValue=$(this).data('val');
        $scope.$apply();
    });
}

Кстати, вы можете использовать событие jquery внутри angular..

person Vidhya Sagar Reddy    schedule 08.08.2013

В идеале в angularJS контроллер не должен напрямую обновлять ссылку DOM. Если вы хотите добиться того же, вы должны указать один метод над $scope и использовать директиву «ng-click».

Если вы хотите добиться того же с помощью jQuery, он должен войти в директиву как

$scope.$apply()

для обновления области.

person Vishnudas Tekale Kulkarni    schedule 18.09.2015

В вашем jQuery поместите автоматический триггер, например

 $('#input').click(function(){
      $('#input').val('1');
      $('#input').trigger('input'); //add this line this will bind $scope Variable
    });
person Dinesh Sharma    schedule 07.11.2016

Лучше не смешивать манипуляции с DOM с Angular. Попробуйте следующее для HTML-кода кнопки:

<button class="setVal" ng-click="selectValue=1">Set 1</button>
<button class="setVal" ng-click="selectValue=2">Set 2</button>
<button class="setVal" ng-click="selectValue=3">Set 3</button>

Я попробовал это в вашем Plunker, и это сработало.

person Aashish Koirala    schedule 07.08.2013
comment
Это перестанет работать, если вы используете как кнопки, так и выбор. Нажмите вокруг, и вы увидите. - person sushain97; 08.08.2013
comment
Проблема в том, что макет исходит из плагина jQuery. Не могу изменить разметку. :С - person user2071887; 08.08.2013
comment
Если вы не можете контролировать разметку, вы все равно можете изменить ее с помощью jQuery после ее создания: <script> $('button.setVal').each(function(index, item) { $(item).attr('ng-click', 'selectValue=' + $(item).data('val')); }); </script> Также убедитесь, что кнопки находятся внутри элемента div, привязанного к контроллеру. У меня не было проблемы с sushain97. - person Aashish Koirala; 08.08.2013
comment
Если мои комментарии вместе с моим ответом работают для вас, не могли бы вы пометить его как ответ? Спасибо! - person Aashish Koirala; 09.08.2013