2017-01-04 8 views
0

TL; TR; ниже

Я имею дело с огромным приложением, где все делается супер-родовым, чтобы легко расходуть. Одним из компонентов является диалог. Теперь перед вашим ответом используйте ngInclude или угловые шаблоны, позвольте мне объяснить, как они работают и почему мы хотели бы придерживаться их.

Поток создания этого диалога:

  1. Где-то в JavaScript Javascript функция вызывается.
  2. Это конструкция контейнера для диалога. Положение, ширина, высота, серый фон и т. Д.
  3. После этого появится индикатор загрузки, тогда как запрос GET будет иметь место на заднем конце.
  4. В фокусе Action указано имя представления и модель.
  5. Этот вид (файл .cshtml) загружается в построитель строк. Чтобы дать вам представление о том, что происходит, вот фрагмент кода, в который загружается представление.

    var sb = new StringBuilder(1); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
        ..... 
        var helper = new HtmlHelper(viewContext, viewDataContainer); 
        using (helper.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
        { 
         helper.RenderPartial(viewName, model); 
        } 
        return sb.ToString(); 
    } 
    
  6. Затем возвращается строка, в JavaScript в конце концов будет установлен как HTML: diag.html(jsonResponse.data);

Теперь вид, что я загружаю, содержит угловые элементы, такие как ng-controller и скобки, чтобы показать что-то из этот контроллер. Вот .cshtml:

@model int 
<div ng-controller="dialogGridColumnSelectionController as dgc" ng-init="dgc.init(@Model)"> 

    <table> 
     <thead> 
      ... 
     <tbody> 
     <tr ng-repeat="col in dgc.tableColumns"> 
      <td> 
       <input type="checkbox" name="some" ng-value="dgc.hide"/> 
      </td> 
      <td>{{col.headerName}}</td> 
      <td>{{col.Description}}</td> 
     </tr> 
     </tbody> 
    </table> 
</div> 

Несколько заявлений:

  • ng-app был осужден, позже, он не должен быть нужен здесь, потому что <body> элемент уже есть это.
  • Диалог находится в пределах <body>.
  • Ошибок нет, никаких угловых предупреждений.
  • {{col.headerName}} показывает точно, как это показано, поэтому угловой не работает.
  • Контроллер и все остальные необходимые файлы javascript уже загружены на страницу, с которой открывается это диалоговое окно. Также попытался добавить их здесь, никакой разницы. Я также попытался снова загрузить углы, что дает мне предупреждение, что я tried to load it more than once. Итак, скрипты есть.

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

Так что мой вопрос: возможно ли это? Может ли представление, инициированное с .html() (в javascript), иметь угловое? Как я могу начать «Угловое»? Или почему это не работает с сгенерированным html?

TL, TR и EDIT:

После некоторого копания, я в конце концов сделал это:

dialog.html(jsonResponse.data);//dialog is a created jquery element, jsonResponse.data contains the `.cshtml` content 
if (options.angularCompile && options.angularScope) {//I've set them in options 
    options.angularCompile(dialog)(options.angularScope);//= $compile(dialog)($scope) or $compile(dialog.contents())($scope) 
} 

Из выше HTML, он делает огонь функцию init. Эта функция корректно загружает данные (с других заводов).

var self = this; 

this.tablePageID = 0; 
this.tableColumns = []; 

$scope.hello = "hii"; 
this.init = function (tablePageID) { 
    self.tablePageID = tablePageID; 
    self.tableColumns = gridTableFactory.getTableColumns(tablePageID); 
} 

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

example

Стоит отметить, что ng-repeat сделал это задание в начале, нет никаких элементов. Похоже, он компилируется и забывается.

+0

использовать компиляцию $ перед добавлением html. И постарайтесь сузить свой вопрос - 99% вопросов должны быть связаны с бэкэнд или интерфейсом, а не с обоими. –

+0

В конце концов мой вопрос касается передней части. Угловое не доступно в этой части кода, но завтра я его взломаю и посмотрю, поможет ли это. – CularBytes

+0

Я использовал компиляцию $, кажется, работает с первого взгляда. Он компилирует, выполняет некоторый код контроллера, успешно использует инжекционные заводы. Но когда диалог открыт, показывается простой html. угловые скобки продолжают появляться. Это вроде работает и забывает. – CularBytes

ответ

1

Попробуйте выполнить $scope.$apply(); после использования $compile. Возможно, вам потребуется сообщить угловое значение для обновления привязок. Также старайтесь не использовать jQuery напрямую и вместо этого использовать angular.element("#....").

+0

ugh, я сделал '$ apply()' внутри углового контроллера, дайджест был уже занят, и я предположил, что это не нужно. Для этого не нужно 'angular.element()', хотя для этого нужно работать. – CularBytes