2013-09-27 4 views
0

У меня есть таблица, которую я включаю на разные страницы, это отлично работает, за исключением того, что я не могу получить значения в прилагаемой таблице. Если я использую это на странице:AngularJS Вложенная таблица

<div data-ng-include="'/app/views/tasks/tasksTable.html'" /> 

таблица показывает вверх, но я не могу отобразить значение в файле tasksTable.html, это показывает undefinded:

 <td> 
      <i class="icon-ok-sign" ng-click="addTask()"></i> 
     </td> 
     <td> 
      <input ng-model="task" /> 
     </td> 

От контроллера:

$scope.addTask = function (data) { 
     console.log($scope.task);   
    }; 

Если я помещаю таблицу в свой файл вместо использования ng-include для отображения таблицы, я могу отображать все, что я набираю, на вход, привязанный к ng-model = "task".

+0

Возможно, это потому, что 'ngInclude' создает новую область видимости? http://docs.angularjs.org/api/ng.directive:ngInclude – Cherniv

ответ

1

Причина, по которой вы не можете получить доступ к заданию , объясняется двумя причинами. Во-первых, это потому, что ng-include создает новую область для шаблона, являющегося дочерним элементом области родительского контроллера. Вторая причина заключается в том, что вы привязываете свою строковую модель непосредственно к области и не создаете объект, содержащий вашу модель. Я создал working CodePen example, чтобы продемонстрировать, как решить вашу проблему.

Вы должны read up on prototypical inheritance and how it affects on scopes.

Надеюсь, это поможет.

+0

Спасибо за ссылку, очень хорошая информация. – tcrafton

+2

Хотя ответ кажется правильным, я думаю, что его можно свести к более короткой версии: не используйте ничего без точки в нем в атрибуте ng-model. В вашем примере вы используете «задачу». Когда создается область дочернего объекта, область копируется, поэтому у вас есть независимая копия «задачи». В модифицированном примере Адама он использует «task.value». Здесь «задача» - это объект, а объект «копируется» по ссылке, поэтому задача указывает на тот же объект в родительском и дочернем объектах, и, таким образом, task.value будет получать одно и то же значение. –

+0

@kju Хорошо сказал, однако вы пропустили упоминание другого критического фактора в этом решении. Если вы не объявите этот объект «снаружи» в родительской области, он будет создан только в дочернем элементе (область ng-include) и не будет доступен для родительской области. В противном случае то, что вы сказали, на 100% правильное. Итак, № 1. Всегда используйте объекты для своих моделей и присоединяйте их к областям. Не рассматривайте сами области как модели и не прикрепляйте данные непосредственно к ним. # 2. Всегда объявляйте модели в самой внешней области, где вам нужен доступ к модели. –

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