Вот построчная разбивка:
$scope.checkout = function (cartObj) {
Создается переменная $ scope с именем checkout, которая ссылается на функцию, чтобы вы могли вызывать ее в представлении как checkout()
(например, от кнопки с ng-click = "оформить заказ").
Эта функция передается службе с именем cartObj.
var modalInstance = $modal.open({
Переменная modalInstance используется для вызова метода $ modal service open.
Модальная служба UI Bootstrap $ возвращает модальный экземпляр. Методу open передается объект, который определяет конфигурацию модального экземпляра следующим образом:
templateUrl : 'assets/menu/directives/payment-processing-modal.tmpl.html',
Это говорит о том, что модальному экземпляру следует использовать шаблон, найденный по соответствующему URL.
controller : ["$scope", "$modalInstance", "cartObj", function($scope, $modalInstance, cartObj) {
}],
Это создает контроллер для модального экземпляра, которому передается $ scope, служба $ modalInstance и, что важно, разрешенная служба cartObj.
Сервисы - это синглтоны, которые используются для обмена данными между контроллерами. Это означает, что существует одна версия службы cartObj, и если один контроллер обновляет ее, другой контроллер может запросить службу и получить данные, которые были обновлены любым другим контроллером. Это замечательно, но если переменная должна быть инициализирована с некоторым значением из службы при загрузке контроллера, она вернет undefined, потому что сначала нужно запросить, а затем ждать, чтобы получить данные обратно. Вот где решается проблема:
resolve : { // This fires up before controller loads and templates rendered
cartObj : function() {
return cartObj;
}
}
});
Причина использования разрешения, вероятно, заключается в том, что сам шаблон зависит от того, какие данные из cartObj доступны, КОГДА шаблон загружается. Resolve разрешит обещания ДО того, как контроллер загрузится, поэтому, когда это произойдет, данные будут там и готовы. По сути, разрешение упрощает инициализацию модели внутри контроллера, поскольку исходные данные передаются контроллеру, а не контроллеру, который должен выходить и получать данные.
Разрешенный cartObj - это то, что передается в modalInstance и поэтому может быть доступно в контроллере как: cartObj. someproperty .
Просто необходимо привязать свойство содержимого к стилю. Стили не будут перезаписывать значение элемента управления, если есть привязка присутствует, даже если значение равно Null. Попробуйте это.
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Content" Value="{Binding HurfView.EditedPart}" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}">
<Setter Property="ContentControl.Template">
<Setter.Value>
<ControlTemplate>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
Вы можете вернуть DBNull.Value в качестве FallbackValue привязки для содержимого ContentControl и создать DataTemplate для DBNull:
<DataTemplate DataType="{x:Type system:DBNull}">
<!-- The default template -->
</DataTemplate>
...
<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />