Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
при генерации inputa, хотя в нем и установлено его значение, но angular данное значение не учитывает и берет значение «модели»
01) Одностороннее связывание данных
но angular данное значение не учитывает и берет значение «модели», которое при загрузке страницы является пустым.
html-код элемента находится в одном месте, шаблон его отображения в другом, а контроллер вообще где-то в скриптах в начале страницы
03) Динамическая загрузка содержимого
это использование $scope.$apply() в контроллере.
function FooController($http) {
var vm = this;
vm.getUser = getUser;
function getUser() {
$http.get('/api/user/1')
.then(function (response) {
vm.user = response.data;
});
}
}
<div ng-controller="FooController as vm">
<a href ng-click="vm.getUser()">get user</a>
<pre>{{ vm.user | json }}</pre>
</div>
<div>
<label>Имя:</label>
<input type="text" value="ЭтоНеВидит!!!" ng-model="yourName">
<hr>
<h1>Привет, {{yourName}}!</h1>
</div>
как поведет себя система, если внутри загруженных данных также будут данные, которые нужно «связывать», причем возможно даже при помощи ajax-загрузки.
как поступать, когда в загруженном содержимом присутствуют блоки, содержимое которых также загружается или генерируется динамически?
к тому же в 1.5 появятся компоненты
а при обновлении связывания, вновь берется значение из «ng-init», которое уже не является актуальным. Беда…Это не так, ng-init/al-init срабатывает только на старте.
решил все же не плодить лишних параметров, ведь простота — залог успеха.Я бы не сказал что на RainyJs код выглядит проще, вот сравнение примеров из статьи.
Я далеко не спец в Angular, и возможно, есть способы выполнить данные задачи. Но скорей всего это будет далеко не просто и очень громоздко.
можно решить через костыли и груды ненужного кода
<input rxname="var05" value="2" type="number"><br>
<div rxdata="var05" rxcode="
if(value < 0){ self.classList.add('red'); }
else { self.classList.remove('red'); }
return 'Введено значение: ' + (value||0);
"></div>
<input al-value="var05" type="number"><br>
<div al-class="red: var05 < 0">Введено значение: {{var05}}</div>
Пример<div><label>Кол-во: </label><input type="number" rxname="m_count" value="0" /></div>
<div><label>Цена: </label><input type="number" rxname="m_price" value="0"
rxdata="m_count m_summa"
rxcode="
if(rxname.toLowerCase() !== 'm_summa')return undefined;
return ((values['m_count']||0) != 0)
? (values['m_summa']||0) / values['m_count'] : 0;
"/></div>
<div><label>Сумма: </label><input type="number" rxname="m_summa" rxdata="m_count m_price" value="0"
rxcode="return (values['m_count']||0) * (values['m_price']||0);"/>
</div>
<div><label>Кол-во: </label><input type="number" al-value="m_count" (input)="m_sum=m_price*m_count" /></div>
<div><label>Цена: </label><input type="number" al-value="m_price" (input)="m_sum=m_price*m_count" /></div>
<div><label>Сумма: </label><input type="number" al-value="m_sum" (input)="m_price=m_sum/m_count"/></div>
Пример tag = $("#id004");
delete tag[0].ma_bootstrapped;
$("#b01").removeAttr("al-init");
alight.bootstrap(tag[0],{"name":value});
у меня не работало обновление через alight.bootstrap()Это не шаблонизатор, данные привязываются к DOM единожды (т.е. нужно вызывать bootstrap единожды для конкретного DOM), после чего можно менять данные при этом привязанный DOM будет меняться.
я просто опишу проблему, с которой пришлось столкнуться.При прочтении статьи чувствовалось, что это библиотека для нескольких конкретных кейсов.
Проблема в том, что записи добавляются/изменяются динамически через ajax-запросы. Каким будет ваше решение?Такие вещи с Angular Light делаются легко, нужна конкретика, примеры ajax результата, вставляется html?
И в этом нет ничего страшного, это обыкновенный процесс развития технологий.Все правильно, при этом вы ещё получили хороший опыт.
зачем вообще AngularLight или vue.js, если есть Angular?
Проблема в том, что записи добавляются/изменяются динамически через ajax-запросы. Каким будет ваше решение?
class FooService {
/*@ngInject*/
constructor($http) {
this.$http = $http;
}
function getItems() {
return this.$http.get('/items').then(response => {
let items = response.data;
// тут могут быть какие-то действия с полученными данными
return items;
});
}
function createItem(item) {
return this.$http.post('/items', item);
}
function updateItem(item) {
return this.$http.put('/items/' + item.id);
}
function deleteItem(item) {
return this.$http.delete('/items/' + item.id);
}
}
class FooController {
/*@ngInject*/
constructor($foo) {
this.$foo = $foo;
this.items = [];
this.isLoading = false;
this.error = false;
this.fetchData();
}
fetchData() {
this.isLoading = true;
return this.$foo.getItems()
.then(items => {
this.items = items;
this.error = false;
})
.catch(() => {
this.error = true;
})
.finally(() => {
this.isLoading = false;
});
}
addItem() {
this.items.push({amount: 1, cost: 100});
}
createItem(item) {
this.isLoading = true;
return this.$foo.createItem(item).then(() => {
return this.fetchData();
});
}
updateItem(item) {
this.isLoading = true;
return this.$foo.updateItem(item).then(() => {
return this.fetchData();
});
}
deleteItem(item) {
this.isLoading = true;
return this.$foo.deleteItem(item).then(() => {
return this.fetchData();
});
}
}
angular.module('app', [])
.service('$foo', FooService)
.controller('FooController', FooController);
<div ng-controller="FooController as vm">
<table ng-hide="vm.isLoading">
<thead>
<tr>
<th>ID</th>
<th>Amount</th>
<th>Cost</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in vm.items track by item.id">
<td><strong>{{ item.id }}</strong></td>
<td><input type="text" ng-model="item.amount"></td>
<td><input type="text" ng-model="item.cost"></td>
<td><a href ng-click="vm.deleteItem(item)">delete</a></td>
<td><a href ng-click="vm.updateItem(item)">update</a></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan=5><a href ng-click="vm.addItem()">Add</a></td>
</tr>
</tfoot>
</table>
<div ng-show="vm.isLoading">
<img src="loading.gif" alt="">
</div>
</div>
Буду рад, если вы предложите свой вариант на Angular, Angular Light или на любом другом фреймворке или библиотеке. Думаю, что достаточно многие программисты сталкиваются с подобной задачей, особенно те, кто используют для разработки серверные фреймворки.
<input type="text" data-bind="predefined, value: username" value="Василий Петрович"/>const domNode = document.getElementById('some');
const vm = { username: ko.observable };
ko.applyBindings(vm, domNode);
vm.username(); // Василий ПетровичВы ajax-ом получаете HTML формы\таблицы или таки данные для неёЯ использую серверный фреймворк Yii2, в нем есть компонент GridView, который генерирует таблицу. В нем есть возможность «обернуть» данную таблицу в PJAX, чтобы записи добавлялись/изменялись без перезагрузки всей страницы, а только перезагрузкой непосредственно самой таблицы. Т.е. через ajax приходит именно полноценный html-код страницы, загружается, и затем вызывается событие «ТаблицаЗагружена».
никто не показал даже хоть какое-нибудь решениеЯ вам выше привел несколько примеров.
Буду рад, если вы предложите свой вариантНапример так
Думаю, что достаточно многие программисты сталкиваются с подобной задачейПрограммисты (которые используют MV* фреймворки) обычно делают SPA поэтому у них не возникает таких проблем.
загружаемый фрагмент будет очень огромный
Нельзя ли выполнить обновления связей без использования переменной?Можно
Просто в моем случае загружаемый фрагмент будет очень огромный. Не хотелось бы хранить его в переменной.Переменная весит копейки* по сравнению с результирующим DOM на основе этой переменной.
если в загружаемом фрагменте будут скрипты — они отработают?Да должны.
RainyJs — как Angular, только для Ajax