Возможно, я сумасшедший или слишком привык к KnockoutJS, но я продолжаю искать директиву ngWith в документах, чтобы определить область действия элемента, контроллера или частичного части (ngInclude).Должна ли существовать директива AngularJS ngWith?
Например:
Я хотел бы написать контроллер, который функционально дополняет MyItem нравится:
MyModule.controller('MyItemCtrl', function($scope) {
$scope.doSomethingToItem = function() {
$scope.name = "bar";
};
});
Или вид/шаблон для MyItem нравится:
<div ng-controller="MyItemCtrl">
{{name}}
<button ng-click="doSomethingWithItem()">Do Something</button>
</div>
Но в обоих из этих случаев я представляю себе, что моя $ scope будет прототипически унаследована от моей модели, MyItem
.
Но сфера не наследует от модели !!
Что меня озадачивает.
Вместо этого моя модель Недвижимость на сфере.
В случае повторителя:
<div ng-repeat="item in list">
<div ng-controller="MyItemCtrl">
{{item.name}}
<button ng-click="doSomethingWithItem()">Do Something</button>
</div>
</div>
что означает везде, где я должен использовать item.this
или item.that
вместо просто this
и that
. Я должен помнить, какие функции являются родными для модели и которые были применены непосредственно к сфере действия контроллером.
Если я хочу, чтобы частично отобразить имена (глупый пример, я знаю, но вы получите идею):
<h3>{{name}}</h3>
я должен написать его
<h3>{{item.name}}</h3>
и тогда убедитесь, что модель всегда шт. Обычно, обернув его в директиве, просто определите область с свойством item
.
То, что я часто чувствую, что я хочу сделать, это просто:
<div ng-include="'my/partial.html'" ng-with="item"></div>
или
<div ng-repeat="list" ng-controller="MyItemCtrl">
{{name}}
<button ng-click="doSomethingWithItem()">Do Something</button>
</div>
Есть ли некая магическая директива, что там я не нашел? Или я совершенно неправ и просто ищу проблемы?
Спасибо.
EDIT:
Большое спасибо Brandon Тилли для объяснения опасности использования областей в качестве моделей. Но я все еще часто нахожу необходимость в некоторой быстрой декларативной манипуляции с областью и желаю директивы ng-with.
Возьмите, например, у вас есть список предметов, которые при щелчке показывают расширенный вид выбранного элемента. Вы могли бы написать что-то вроде:
<ul>
<li ng-repeat="item in items" ng-click="selection = item">{{item.minView}}</li>
</ul>
<div ng-controller="ItemController">
{{selection.maxView}}
</div>
теперь вы должны получить свойства выбранного элемента с помощью selection.property
, а не то, что я хочу: item.property
. Я также должен был бы использовать selection
в ItemController
! Сочетание этой цели с этим взглядом.
Я знаю, в этом простом примере я мог бы иметь контроллер упаковки, чтобы он работал, но он иллюстрирует точку.
Я написал очень простую with
директиву:
myApp.directive('with', ['$parse', '$log', function(parse, log) {
return {
scope: true,
link: function(scope, el, attr) {
var expression = attr.with;
var parts = expression.split(' as ');
if(parts.length != 2) {
log.error("`with` directive expects expression in the form `String as String`");
return;
}
scope.$watch(parts[0], function(value) {
scope[parts[1]] = value;
}, true);
}
}
}]);
, который просто создает новую область разборе одно выражение на другое значение, позволяя:
<ul>
<li ng-repeat="item in items" ng-click="selection = item">{{item.minView}}</li>
</ul>
<div with="selection as item" ng-controller="ItemController">
{{item.maxView}}
</div>
Это кажется бесконечно полезно для меня.
Я что-то упустил? Просто как-то беспокоиться о себе?
Отличный ответ. Я не видел этого видео. – nicholas
Я вижу, что директива ng-with используется для других вещей, например, для хранения вывода дорогостоящего вызова метода модели EG:
. Извлекающее правило большого пальца от видео: «Всякий раз, когда у вас есть ng-модель, там где-то есть точка. Если у вас нет точки, вы делаете это неправильно. –