2013-06-18 4 views
7

Ситуации:нг-включает в себя - контроллер называются несколько раз

Я пытаюсь включить частично с ng-include без необходимости какого-либо маршрута. Я просто хочу включить конкретное частичное из многих динамически. Это примерно то же самое:

<div ng-controller="SomeController"> 
    //This controller defines a $scope.getPartial(id) 
    <ng-include src="getPartial(something.id)"></ng-include> 
</div> 

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

GET путь/к/обертоны/undefined.html [HTTP/1.1 404 Not Found 162ms]

кажется, что-то.и не определено, когда включение сделано в первый раз.

Вопросы:

  • как я могу просто включить частичное, без создания новой области?
  • если это невозможно, как я могу убедиться, контроллер вызывается только один раз?
  • и как я могу избежать 404?

Я довольно новичок в AngularJS и поэтому могу ошибаться в предположениях о вещах или пропустить очевидные вещи, пожалуйста, просветите меня.

ответ

6
  1. ngInclude создает по-новому область по определению, поэтому вы не можете легко обойти ее. И, поскольку вложенные области наследуются друг от друга, ваша вновь созданная область сможет читать все, что находится в вашем SomeController, поэтому у вас не должно быть проблем с новой областью.
  2. Атрибут src ngInclude будет переоценен в каждой сумме $ digest, поэтому вы не сможете остановить его от повторного вызова метода вашего контроллера. В этом отношении вы должны убедиться, что ваш метод является легким и быстрым, и он возвращает тот же результат, учитывая тот же вход
  3. Вы можете избежать первоначальных 404, возвращая пустую строку «», когда идентификатор еще не определен:

 

$scope.getPartial = function(id){ 
    if(!id){ 
    return ""; 
    } 
    ... 
} 
+7

+1. Я также хотел бы добавить, что в угловой партии вещи будут называться много раз или иногда неожиданно. Вам нужно перевести свое понимание с императивного на декларативное. Подумайте, css. Вы не заботитесь (обычно), сколько раз браузер перекрашивает, переплачивает на основе изменений стиля/класса. –

+0

+1 Хорошее сравнение с перерисовкой CSS. – Stewie

+0

Спасибо, кажется немного взломанным, но, возможно, я просто не привык к парадигме repaint;) – markus

Смежные вопросы