Подтвердить что ты не робот

Как включить один частичный в другой, не создавая новую область?

У меня эти маршруты.

// index.html
<div ng-controller="mainCtrl">
    <a href='#/one'>One</a>
    <a href='#/two'>Two</a>
</div>​​​​​​​​​
<div ng-view></div>

И вот как я загружаю частичные части в мой ng-view.

// app.js
​var App = angular.module('app', []);​​​​​​​
App.config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/one', {template: 'partials/one.html', controller: App.oneCtrl});
    $routeProvider.when('/two', {template: 'partials/two.html', controller: App.twoCtrl});
  }]);

Когда я нажимаю ссылки, он показывает мне соответствующую разметку внутри ng-view. Но когда я пытаюсь включить partials/two.html внутри partials/one.html с помощью ng-include, он показывает его правильно, но создает другую область, поэтому я не могу взаимодействовать с ней.

// partials/two.html - markup
<div ng-controller="twoCtrl">I'm a heading of Two</div>

// partials/one.html - markup
<div ng-controller="oneCtrl">I'm a heading of One</div>
<div ng-include src="'partials/two.html'"></div>

Как решить эту проблему? Или есть ли другой способ добиться того же результата?

4b9b3361

Ответ 1

Фактически вы можете сделать это без использования общей службы. $scope. $emit (...) может отправлять события в $rootScope, который может слушать их и ретранслировать в дочерние области.

Демо: http://jsfiddle.net/VxafF/

Справка: http://www.youtube.com/watch?v=1OALSkJGsRw (см. первый комментарий)

Ответ 2

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

MyDirectives.directive('staticInclude', function($http, $templateCache, $compile) {
    return function(scope, element, attrs) {
        var templatePath = attrs.staticInclude;
        $http.get(templatePath, { cache: $templateCache }).success(function(response) {
            var contents = element.html(response).contents();
            $compile(contents)(scope);
        });
    };
});

Вы можете использовать это как:

<div static-include="my/file.html"></div>

Ответ 3

Документация для ngInclude утверждает " Эта директива создает новую область действия., поэтому это по дизайну.

В зависимости от типа взаимодействия, которое вы ищете, вы можете взглянуть на этот пост для одного способа обмена данными/функциями между двумя контроллерами через a пользовательская услуга.

Ответ 4

Так что это не ответ на этот вопрос, но я сделал это здесь, ища что-то похожее и, надеюсь, это поможет другим.

Эта директива будет включать частичное без создания новой области. Например, вы можете создать форму в частичном и управляющем виде из родительского контроллера.

Вот ссылка на Repo, которую я создал для нее.

удачи:-)

-James Harrington