Угловое представление не обновляется при использовании соединения из директивы

0

Я создаю угловое приложение, в котором вы можете добавлять и удалять виджеты/модули со страницы. Различные типы модулей имеют разные шаблоны. Однако представление не обновляется, когда я использую splice для удаления объекта. Я попытался назвать $ scope. $ Apply(); от функции deleteModule, но получил ошибку выполнения.

Я вызываю ng-click="deleteModule(module) на кнопке, которая добавляется директивой. Кроме того, результат $scope.modules.indexOf(module); всегда -1. Я предполагаю, что эти проблемы идут рука об руку,

EDIT: Сделано codepen http://codepen.io/anon/pen/XmjEJr

Контроллер и директива:

var ponk = angular.module("ponk", []);

ponk.controller("AppCtrl", ["$scope", function($scope) {

  //dummy data
  $scope.modules = [
    {
      type: "text",
      content: "this is a text field"
    },
    {
      type: "youtube",
      content: "adress to youtubevideo"
    }
    ];

    $scope.showAddModule = false;

    $scope.newModule = {
      type: "text",
      content: ""
    }

  $scope.toggleAddModule = function () {
           $scope.showAddModule = !$scope.showAddModule;
  };

  $scope.addModule = function() {
      $scope.modules.push($scope.newModule);
      $scope.newModule = { type: "text", };
      $scope.showAddModule = false;
  };

  $scope.deleteModule = function(module) {
      var index = $scope.modules.indexOf(module);
      if(index != -1) {
        $scope.modules.splice(index);
        console.log("splice");
      } else {
        console.log("nosplice");
      }
      console.log($scope.modules);
  };

}]);

ponk.directive("module", function($compile) {
// the deletebutton is added here
  var before = '<div><span class="glyphicon glyphicon-remove-circle pointer" ng-click="deleteModule(module)"></span></div>';
  var textTemplate = '<div class=" col-xs-2">' + before + '<div class="module">{{ module.content }}</div></div>';
  var youtubeTemplate = '<div class="col-xs-4">' + before + '<div class="module"><iframe id="ytplayer" type="text/html" width="500" height="300" src="http://www.youtube.com/embed/?autoplay=0" frameborder="0"/></div></div>';

  var getTemplate = function(type) {

    var template = "";
    switch(type) {
      case "youtube":
        template = youtubeTemplate;
        break;
      case "text":
      default:
        template = textTemplate;
        break;
    }
    return template;
  }

  var linker = function(scope, element, attrs) {
    var el = $compile(getTemplate(scope.module.type))(scope);
    element.replaceWith(el);
  }

  return {
    scope: {module: '=',},
    transclude: 'true',
    controller: 'AppCtrl',
    restrict: 'E',
    link: linker,
  }
});

HTML:

<div class="container-fluid" ng-app="ponk" ng-controller="AppCtrl">

    <div class="row">
      <div class="col-xs-2">

          <button class="btn btn-default add-module" ng-click="toggleAddModule()">Add module</button>
          <div ng-show="showAddModule">
            <form action="" novalidate>
              <div class="form-group">
                <label for="moduleType"></label>
                <select class="form-control" name="moduleType" ng-model="newModule.type">
                  <option value="text" selected>Text</option>
                  <option value="youtube">Youtube</option>
                </select>
              </div>

              <div ng-switch="newModule.type">

                <div ng-switch-when="youtube" class="form-group">
                  <label for="youtube">Youtube</label>
                  <input type="text" name="youtube" ng-model="newModule.content" class="form-control">
                </div>
                <div ng-switch-when="text" class="form-group">
                  <label for="formText">Text</label>
                  <textarea ng-model="newModule.content" name="formText" class="form-control"></textarea>
                </div>

              </div>
              <button ng-click="addModule()" type="button" class="btn btn-default">Add</button>
            </form>
          </div>
      </div>
      
      <div class="col-xs-10">
        <!-- the directive -->
        <module ng-repeat="module in modules" module="module"></module>
      </div>
      
    </div>
  • 2
    правильный вызов myArray.splice(index, 1) для склеивания 1 элемента от индекса и далее.
  • 0
    Угадайте: ваша директива использует изолированную область и не имеет доступа к функции deleteModule определенной в родительской области. Тест: добавить console.log('hello'); в вашей функции и проверьте, если она печатается при нажатии кнопки. (Помимо приведенного выше комментария о неправильном использовании split ).
Показать ещё 1 комментарий
Теги:
angularjs-scope
angularjs-directive

1 ответ

0

вам нужно указать количество $scope.modules.splice(index,1) элементов в вашем случае: $scope.modules.splice(index,1)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню